【问题标题】:npm update: pull from github repo not taking latest commitnpm 更新:从 github repo 中提取不接受最新提交
【发布时间】:2020-10-10 00:24:33
【问题描述】:

项目中的一个包基于内部 npm 存储库。

{
  "dependencies": {
    "my-library": "git+ssh://<gitrepo>#dist"
  }
}

其中 dist 是要克隆的分支。这“有效”,因为它安装了正确的版本。但是,每当此分支发生更新时,我无法使用 npm 进行更新? - 我试过 npm update My-Library 但这只是下载旧的提交,它不会转移到同一分支中的新提交。

我找到的唯一“解决方案”是从 node_modules 文件夹中手动删除库,并删除 package-lock.json 中的库条目(或将那里的引用更新为正确的提交)。

使库遵循另一个 git 存储库的最新版本的正确方法是什么?

编辑:如果这只是一个明确的“不支持”,那对我来说也足够了。

【问题讨论】:

  • 旁注:我个人更喜欢在 npm 依赖项中使用 git 哈希而不是 git 分支。这样我就确定我有我想要的提交,并且我的依赖项在某个时间点得到修复,确保它在未来不会中断。
  • @xurei 我们为此使用了一个特定的分支。 - 一旦我们需要对此进行更多控制,它将转移到具有语义版本控制的私有 npm 存储库。 npm ci 应该只考虑包锁,我完全希望将自己修复到特定的提交)。

标签: node.js git npm


【解决方案1】:

根据我的理解和实验,问题似乎与package-lock.json 的工作方式有关。我设置了一个库,其中一个依赖项设置为

"fn-with-hooks": "git+ssh://git@github.com/hackape/fn-with-hooks.git#master"

初始的npm install 会生成一个package-lock.json,其中包含

"fn-with-hooks": {
  "version": "git+ssh://git@github.com/hackape/fn-with-hooks.git#fa1e21a8ea2fd2b0b7ec5897b954266791b56ac4",
  "from": "git+ssh://git@github.com/hackape/fn-with-hooks.git#master"
},

如您所见,version 字段被锁定到特定的提交哈希,随后对npm install 的调用不会更改此版本字段,从而防止“跟踪”分支到最新提交。这就是 lockfile 的工作方式。

删除package-lock.json,(不需要删除node_module/lib)然后npm install可以解决这个问题。

我的直接想法是尝试从package-lock.json 中排除这个特定的库。但是 npm lockfile 是一个整体解决方案,并没有提供这样的细粒度控制。

因此,沿着这条路走下去的唯一选择是禁用package-lock.json

如果您仍打算使用package-lock.json,一种解决方法是手动运行npm update lib-name 命令以强制将该库更新到最新版本。这也会相应​​地更新 lockfile 中的 version 字段。


更新

我不确定为什么 npm update 对您不起作用。它适用于我的。也许您想仔细检查这是否确实是事实,或者您的误解。虽然我严重怀疑它是,它也可能是 npm 版本差异。我使用的是 v12.14。

我有另一种解决方法,我尝试过并且成功了。你不必删除整个package-lock.json文件,你可以重写它来排除那个git-base lib的记录。这种方式 npm 缺少锁定信息,因此必须重新获取您的库。 lockfile 中的其他 lib 记录保持不变,因此限制了影响范围。

【讨论】:

  • package-lock.json 是否只能在一个“时间”内禁用 - 我们严重依赖 package-lock 进行部署?正如之前的海报已经注意到的那样,npm update lib-name 不会比package-lock 更进一步地更新基于git 的依赖项,它只是不会更新。
  • @paul23 你真的需要仔细检查。我和 Trott 的另一个答案都观察到与您的描述相反的行为。 npm update lib-name 确实更新了 git base dep.
  • 查看我的更新答案,了解类似于一次性禁用行为的解决方案。
  • @hackape npm update 工作得很好,我对此没意见,我面临的一个奇怪问题是,如果我将 npm update 放入 preinstall 钩子 npm i 它不会t工作并给出C:/Program Files/Git/mingw64/libexec/git-core\git-submodule: line 22: .: git-sh-setup: file not found的错误
  • 使用像 1) 更新/推送 git 依赖项 2) 依赖项目的 npm 更新这样的工作流就可以了。 package-lock.json 中的提交 ID 确实是问题所在。感谢您为我节省了大量时间。
【解决方案2】:

您描述的行为不是我看到的行为(尽管请参阅最后一段以了解可能发生的情况)。我创建了一个打印console.log() 的模块并将其推送到git 存储库分支。我的package.json 看起来像这样:

{
  "name": "temp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "MIT",
  "dependencies": {
    "slug": "git+ssh://git@github.com/trott/slug.git#temp"
  }
}

我的 index.js:

require('slug');

我运行 npm installnode index.js 并看到了预期的消息。

然后我更新了消息,提交并推送到分支。我跑了npm update 并收到了新消息。

我第二次更新了消息,再次提交并推送到分支。这一次,我跑了npm update slug,它仍然更新了包。

我的npm 版本是 6.14.8。

我做的一件事导致它更新是如果我使用不同的大小写,我注意到你在上面做了。您的package.json 条目显示my-library,但您的命令是npm update My-Library。大小写不同。我做了npm update Slug 并没有更新模块。这会是你麻烦的根源吗?如果不是,你可能会做与我上面做的不同的事情吗?如果没有任何想法,也许您可​​以尝试我上面描述的内容,看看它在哪里对您不利? (或者你的测试用例已经那么简化了吗?)

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 2021-10-27
    • 2014-08-17
    • 2015-06-02
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多