如何让npm优先使用本地链接依赖项而不是已发布的安装包

16

我已经查看了其他类似的问题,例如这个问题,但他们似乎都是关于本地npm link停止工作的原因与我的不同。我认为这是一个常见的使用问题,因此,如果我在方法上做错了什么,我非常乐意听取如何应该做的建议。

首先,我有一个名为@organisation/module的私有npm模块正在开发中。当我在本地工作时,我会在其上运行npm link,并在我的“主机”项目中使用它作为npm link @organisation/module- 这一切都很好,包括热重载等。我还将其导入为import module from '@organisation/module

然而,由于我也想定期将我的本地更改发布到npm(作为@organisation/module),以进行构建测试和生产代码,所以我需要在主机项目上运行npm install @organisation/module

然后,这似乎会破坏我早先设置的隐式npm link... 我认为这主要是因为它们具有相同的名称,而npm优先考虑install而不是link

当我想再次进行实时本地更改时,目前唯一可以使其正常工作的方法是通过 npm uninstall @organisation/module 然后重新链接它。

有没有一种方法可以保留已发布的模块(以避免疏忽错误,例如忘记为构建测试重新安装它),但始终优先使用本地链接的实例?

参考图表: Diagram for ref


1
更新 - 我最终编写了一个bash / npm脚本组合,将这些手动取消链接/重新安装变为半自动状态... 但我仍然想知道是否有在npm中可以静态分配的东西来完成这个任务! - Sarreph
3个回答

4
你尝试过使用 npm 提供的另一种本地安装方法吗?
npm install /absolute/path/packageName

我相信这会改变你在package.json中的输入,使其看起来像这样:
"dependencies" {
    ...
    "packageName": "file:../../path/to/packageName",
    ...
}

3
事情是,这个方法可行,但是现在任何人拉取我的代码并尝试 npm install 将会出现错误,如果他们还没有先拉取依赖项到 ../../module/。支持通常情况下的“拉取代码,运行 npm install,项目正常工作”的情况。 - Coderer
1
@Coderer 我明白了,你也可以尝试将它链接到你的git仓库:npm install --save https://github.com/{USER}/{REPO}/tarball/{BRANCH} - AndrewSteinheiser

1
由于npm link在全局文件夹中创建符号链接,而npm install是针对项目本地的,因此npm install具有优先权。您可以在这里阅读有关npm link的信息:https://docs.npmjs.com/cli/link 为了避免这种情况,我的建议是使用npm install <path to local>,当您需要使用生产代码时,请使用npm install @organization/module。这将根据每个代码更新您的node_modules。在这里阅读有关npm install的信息:https://docs.npmjs.com/cli/install 希望这能帮到您 :)

-1
  1. 进入本地包所在的目录,打开 package.json 文件,将名称从原始名称更改为 "original_name_local"。

  2. 在同一位置的终端上输入 npm link

  3. 完成后,转到您的工作目录并编写 npm install <path to local>

  4. 现在,在任何需要 requireimport 的地方,将名称更新为 "original_name_local"。

例如,如果是 require('space-cleaner'),则将其更改为 require('space-cleaner_local')

这样,您就可以同时拥有本地和生产包,只需在需要更改名称的地方更改即可。

否则,您可以通过从 package.json 中删除它并从 node_modules 中删除它来删除包。

如果需要本地包,请转到本地包目录,并在终端上编写 npm link,然后在您的工作目录中编写 npm install ./path/to/package

如果需要生产包,则再次按上述方法删除包,并编写 npm install package_name


2
这个问题的整个意义在于,可以无缝地针对模块的本地副本进行开发,同时允许他人使用模块的发布版本拉取和构建您的软件包。手动更改代码是费力且容易出错的。 - Coderer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接