有没有办法指定新版本的 npm
只使用 "lockfileVersion": 1
?还是我们只能让所有开发人员使用相同版本的 npm
?
我建议您锁定Node/NPM版本,并在开发、测试和生产环境中保持一致。
您可以利用 nvm
来管理Node版本,通过在项目中添加.nvmrc
文件来实现(别忘了将其存储在源代码控制中)。
例如,.nvmrc
将如下所示:
$ cat .nvmrc
14.15.0
然后,您可以使用nvm install && nvm use
来使用固定版本的Node。
NPM还支持engines
:
您可以指定您的程序适用的Node版本:
{ "engines" : { "node" : ">=0.10.3 <0.12" } }
与依赖项一样,如果不指定版本(或将版本指定为“*”),则任何版本的Node都可以。
如果指定了“engines”字段,则npm将要求“node”在该列表中的某个位置。 如果省略了“engines”,则npm将假定它适用于Node。
您还可以使用“engines”字段来指定哪些版本的npm能够正确安装您的程序。 例如:
{ "engines" : { "npm" : "~1.0.20" } }
除非用户设置了engine-strict配置标志,否则此字段仅是建议性的,并且仅在将您的软件包作为依赖项安装时产生警告。
当利用engines
字段并且要求npm
在版本约束不满足时失败时,可以在.npmrc
文件中设置engine-strict=true
(默认情况下为false
)或者作为npm_config_engine_strict=true
环境变量
如果设置为true,则npm将固执地拒绝安装(甚至考虑安装)任何声明与当前Node.js版本不兼容的软件包。
可以通过设置--force标志来覆盖此设置。
另一种方法是使用Docker容器作为开发和执行的运行环境,这意味着您既不需要安装Node也不需要NPM。例如:
$ mkdir my-project
$ cd my-project
$ docker run --rm -it -v $PWD:/app --entrypoint /bin/bash --workdir /app node:14.15.0
root@4da6ee3c2ac0:/app
Wrote to /app/package.json:
{
"name": "app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
root@4da6ee3c2ac0:/app
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN app@1.0.0 No description
npm WARN app@1.0.0 No repository field.
up to date in 1.694s
found 0 vulnerabilities
root@4da6ee3c2ac0:/app
exit
$ ls -x1
package-lock.json
package.json
正如您所看到的,既没有Node,也没有NPM:
- 为新项目创建一个新目录
- 启动一个Node Docker容器,该容器已安装了Node和NPM
- 创建一个新项目(
npm init -y
)
- 退出Docker容器
- 列出工作目录中容器所在的文件
由于上面的docker run
命令很长,您可能希望利用docker-compose进行更简化的工作流程。
.*rc
文件,但这可能是真正的答案和解决潜在问题的最佳整体解决方案。 - Bennvm ls
而不是查看rc文件。它可以提供更多关于你拥有哪些版本和哪一个正在运行的信息。这种方法更容易记忆,因为大多数版本管理器都有类似的命令。 - jcollumnvm install-latest-npm
。 - Clément Renaudnvm install && nvm use
(其中.nvmrc包含12
),将设置npm为v6,但是一旦在您的笔记本电脑上安装了最新版本的npm(npm install -g npm@latest
),它也会更新到您的nvm版本中(nvm use
现在返回npm v8),因此您不能确保开发团队之间的一致性。 - manuchaud100package.json
中的engine
应该涵盖它。如果不行,我建议改进答案。 - Mr.