从Git仓库获取最新软件包的npm命令

17

我的问题类似于这个

一个项目依赖于一个Git模块,该模块存储在私有托管的存储库中:

"dependencies": {
  "mymod": "git+https://mygitserver:8443/scm/od/mymod.git",
  ...
}

这是希望它成为一个快照依赖项,因此每当修改任何mymod代码时,项目会拉取最新版本。

问题在于,我应该使用什么命令来正确更新模块的最新版本?

我唯一发现有效的方法是:

rm -rf node_modules/mymod
npm install

仅运行npm install不会有任何作用(假设它已经运行过一次),正如@Vishwanath在他的问题中指出的那样,因为该模块已经安装。 npm upgrade不适用,因为我还依赖于许多其他模块,并且我不想将它们全部升级到新版本。

我想我可以明确地对mymod进行版本控制,然后每当它更改时更新我的本地package.json,但这会创建一个持续的维护任务。

似乎npm具有足够的信息来确定何时需要升级,因为node_modules/mymod/package.json包含最后已知的头部修订版本,可与当前头部修订版本进行比较:

"gitHead": "b63f0df8ef...",
"_resolved": "git+https://mygitserver:8443/scm/od/mymod.git#b63f0df8ef..."

npm是否有处理这种快照依赖项的首选方式?


比删除本地模块稍微好一点的方法是重新运行显式安装命令:npm install "git+https://mygitserver:8443/scm/od/mymod.git" - chris
5个回答

17

更新 - 2021年 - 开发与生产中的私有包

在我的新项目中,我尽力编写代码以适应生产和开发环境而最小程度的修改。与我的私有包协作是其中的一个挑战。

我想在本地上使用我的包进行开发,这样所有更改都会立即应用,而不需要像下面的解决方案那样手动更新每个单独的包。但是在生产环境中,当我执行npm install时,我希望它能够安装来自我的git特定版本的包。

所以我使用了两个不同的依赖关系,一个用于生产,另一个用于开发。

package.json:

"dependencies": {
  "package-name": "git+ssh://git@bitbucket.com:*git package/path*.git#1.0.0",
},
"devDependencies": {
  "package-name-dev": "file:*package path*"
}

现在,我已经拥有了这两个包,在开发过程中,每次调用主要包时我需要使用开发包而不是在所有文件中进行大量的 if(isDev){...} 判断。
为了达到这个目的,我使用了 module-alias 包,它可以让我对一个模块进行别名设置,一次设置将适用于整个项目。
app.js 文件的顶部:
const isDev  = (process.env.NODE_ENV === 'development'),
      isProd = (process.env.NODE_ENV === 'production');

if (isDev) {
  const moduleAlias = require('module-alias');

  moduleAlias.addAlias('package-name', 'package-name-dev');
}

好的,现在每当我使用const pack = require('package-name')时,在开发环境下它将调用本地包(dev),而在生产环境下它将调用主要包(main)。

注意 - 在主要包中,我在git URL的末尾使用了一个标签(#1.0.0),我在多个项目中使用同一个包,并且我希望确保我可以在每个项目中手动测试最新版本,以便不会出现任何问题。


原回答-手动更新包

我找不到更好的方法来做到这一点,最终我在package.json中添加了一个脚本,手动安装所需的包。

package.json中添加一个脚本,以更新所需的包:

"scripts": {
   "update:packages": "npm install git+ssh://git@GIT_URL_HERE#master"
}

虽然这与手动更新软件包相同,如其他答案的评论中@chris所说,但这种方法更加简单易行,且可以与以下内容配合使用:

npm run update:packages

注意 - 末尾的 #master 标签将安装主分支而不是最佳版本,这并不是最优的做法,但它允许你在不手动更改标签的情况下安装包的最新版本。

更新 - 如果你需要这个工具进行开发,并且私有仓库中的包是本地项目(像我一样),那么你可以简单地将包链接到项目中,所有更改将立即显示出来,无需重新安装,更多关于link的信息

cd /path/to/working/dir
npm link ../path/to/package/dir

更新 2 如果你使用 Docker,npm link 在 docker 内部将无法工作,这是因为 link 正在设置对本地 npm 文件夹的软链接。 为了避免这种情况,您需要在 docker 内部设置软链接 路径。


13

您可以手动更新软件包。

npm update mymod

这将使用最新的哈希提交更新您的 package-lock.json 文件。


1

我尝试在package.json中更新版本号,但是仍然没有更新包。似乎唯一的方法是每次删除旧包。


0

我将我的 package.json 文件更改为以下内容,这样做可以正常工作

"scripts": {
    .......
    "updateGit": "npm uninstall PACKAGE-NAME && npm install git+https://github.com/..../PACKAGE-NAME.git"
  },

那么

npm run updateGit

-1

您需要更新mymod中package.json的版本,以使npm安装更新的代码。


重点是package.json中没有版本号 - 这是一个快照依赖项,因此应始终使用最新的代码。 - chris
据我所知,npm非常注重版本号。但是我指的是在mymod中更新版本,而不是在您的主项目中更新。您能否使mymod在提交或推送时自动增加其版本号? - Anders Bornholm
啊,我明白你的意思了。有趣的想法。我99%确定 npm install 甚至不会连接到 Git 服务器,但我会尝试一下。 - chris
我知道npm拒绝从github安装新代码,即使我标记了一个新版本,但当我忘记在package.json中更新版本时。 - Anders Bornholm
我尝试按照建议在mymod中更新了package.json中的版本。但是对于npm install没有任何影响,它仍然无法正常工作。它甚至无法连接到Git存储库。只有通过显式的npm install git+https://etc/mymod命令才能强制拉取最新版本。 - chris

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