更新 - 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 内部设置软链接 路径。
npm install "git+https://mygitserver:8443/scm/od/mymod.git"
。 - chris