如何在链接的 npm 依赖项(在开发中)和已安装的依赖项(在登台/生产中)之间切换?

mhe*_*zig 4 node.js npm npm-shrinkwrap

我有一个正在处理的自定义 npm 模块,它有一个 GitHub 存储库。我也在做一个使用自定义模块的项目。在处理较大的项目时,使用起来很好,npm link因此我可以对模块进行更改并立即在主项目中看到它们。

为了部署到暂存或生产,我使用了shrinkwrapshrinkpack,所以我可以npm install在每次部署之后做一个(一些依赖项需要二进制文件,而开发系统与生产系统不同,所以它们确实需要安装,而不仅仅是保留在源代码管理中)。 编辑:我将这一点划掉,因为下面的答案在技术上解决了我的问题,即使它没有解决这个特定的问题,但这并不像其他问题那么重要。

当然,由于模块链接到我的主项目并且未在 中列出package.json,因此部署和安装完全错过了它。我可以继续并列出它package.json并让它指向适当的 GitHub 存储库,但是每次我需要测试主项目中的更改时,我都必须提交并推送这些更改,然后更新主项目,杀死并重新启动应用程序……这很快就会让人厌烦。

我想我需要类似于“devDependencies”的东西;东西在那里我可以把它不能安装在开发的模块,但这样做,当从GitHub安装npm install上登台或生产。除了记住package.json每次需要来回手动更改之外,还有更好的方法吗?

Der*_*ley 5

您可以在 package.json 文件中指定一个 github 存储库作为要安装的包:

{
  dependencies: {
    "my-library": "githubusername/my-library"
  }
}
Run Code Online (Sandbox Code Playgroud)

这将适用于您的生产环境。

在您的开发环境中,使用“npm 链接”。

从“my-library”文件夹中,npm link直接运行。这将告诉您本地机器上的 npm,“我的图书馆”可以作为链接使用。

现在,在您使用“my-library”的项目中,运行npm link my-library. 这将创建一个指向“my-library”的本地开发版本的符号链接,允许您更改该存储库中的代码并使其在需要它的其他项目中工作。

准备好推送到生产环境后,将“my-library”推送到您的 github 存储库,然后您可以像往常一样在服务器上安装 npm。

  • npm 足够聪明,知道你有一个本地链接库,并且它不会覆盖它。我经常这样做。这是本地开发和从任何地方部署(github 或 npm global repo)的最佳方式 (3认同)
  • 这是有道理的......但是如果我在开发中执行“npm install”(或“update”或其他)会发生什么?它不会尝试安装我的库吗?或者“install”是否足够聪明,知道如果存在链接就忽略安装依赖项?(我应该在一个单独的文件夹中尝试一下,之前我只是犹豫是否要测试这个理论,因为我不想在我的主项目中造成巨大的混乱) (2认同)