GVKun编程网logo

npm-shrinkwrap.json 和 package-lock.json 有什么区别?(package.json和package-lock.json)

8

在这篇文章中,我们将为您详细介绍npm-shrinkwrap.json和package-lock.json有什么区别?的内容,并且讨论关于package.json和package-lock.json的

在这篇文章中,我们将为您详细介绍npm-shrinkwrap.json 和 package-lock.json 有什么区别?的内容,并且讨论关于package.json和package-lock.json的相关问题。此外,我们还会涉及一些关于(全局npmrc)nrm、npmrc、package-lock.json 的优先级、node.js – npm package.json和docker(挂载……)、node.js – yarn.lock和npm的shrinkwrap有什么区别?、node.js – 有没有办法确认package-lock.json实际上解析了package.json中的所有依赖项?的知识,以帮助您更全面地了解这个主题。

本文目录一览:

npm-shrinkwrap.json 和 package-lock.json 有什么区别?(package.json和package-lock.json)

npm-shrinkwrap.json 和 package-lock.json 有什么区别?(package.json和package-lock.json)

随着npm@5 的发布,它现在将写入 a package-lock.json,除非 anpm-shrinkwrap.json已经存在。

我通过以下方式全局安装了 npm@5:

npm install npm@5 -g

现在,如果npm-shrinkwrap.json在以下期间找到 a:

npm install

将打印警告:

npm WARN read-shrinkwrap This version of npmis compatible with lockfileVersion@1,but npm-shrinkwrap.json was generated for lockfileVersion@0.I''ll try to do my best with it!

所以我的结论是我应该用package-lock.json.

然而,为什么它有一种新的格式呢?能做什么不能package-lock.json做什么npm-shrinkwrap.json

答案1

小编典典

这些文件具有完全相同的内容,但 npm 处理它们的方式存在一些差异,其中大部分在package-
lock.json和npm-
shrinkwrap.json 的文档页面上都有说明:

  • package-lock.json永远不会发布到 npm,而npm-shrinkwrap默认情况下是
  • package-lock.json不在顶级包中的文件被忽略,但属于依赖项的收缩包装文件被尊重
  • npm-shrinkwrap.json向后兼容 npm 版本 2、3 和 4,而package-lock.json仅被 npm 5+ 识别

您可以通过运行将现有转换package-lock.json为.npm-shrinkwrap.json``npm shrinkwrap

因此:

  • 如果您不将包发布到 npm,则在这两个文件之间进行选择几乎没有影响。您可能希望使用package-lock.json它,因为它是默认的,并且它的名称对 npm 初学者来说更清楚;npm-shrinkwrap.json或者,如果您难以确保开发团队中的每个人都使用 npm 5+ ,您可能希望使用与 npm 2-4 的向后兼容性。(请注意,npm 5 于 2017 年 5 月 25 日发布;从那个日期开始,向后兼容性将变得越来越不重要,因为大多数人最终都会升级。)

  • 如果您 包发布到 npm,您可以选择:

    1. 使用 apackage-lock.json准确记录您安装了哪些版本的依赖项,但允许安装您的包的​​人使用与您指定的版本范围兼容的任何版本的依赖项package.json,或者
    2. 使用 annpm-shrinkwrap.json来保证安装你的包的每个人都得到 完全相同 版本的所有依赖项

文档中描述的官方观点是选项 1 应该用于库(大概是为了减少当包的许多依赖项都依赖于相同辅助依赖项的略有不同版本时引起的包重复量),但是该选项2
对于将要全局安装的可执行文件可能是合理的。

(全局npmrc)nrm、npmrc、package-lock.json 的优先级

(全局npmrc)nrm、npmrc、package-lock.json 的优先级

npmrc

测试 nrm、npmrc 的优先级

实验

1. 没有设置 nrm。

默认设置 registry 为 https://registry.npmjs.org/

下载的所有包都是通过以上域名获取。

2. nrm use yarn。

设置 registry 为 https://registry.yarnpkg.com/。

看源码可知实际做的事情是

npm.commands.config([''set'', ''registry'', registry.registry], function (err, data) {
    if (err) return exit(err);
    console.log(''                        '');
    var newR = npm.config.get(''registry'');
    printMsg([
        '''', ''   Registry has been set to: '' + newR, ''''
    ]);
})

    npm set registry ''https://registry.yarnpkg.com/''

效果为

    cat ~/.npmrc
    registry=https://registry.yarnpkg.com/

安装结果是从 registry.yarnpkg.com 里面下包。

3. 本地使用 npmrc。

当前项目操作

    touch .npmrc

在 npmrc 里面填写,

   vim .npmrc
    registry=https://registry.npm.taobao.org/

安装结果是从 registry.npm.taobao.org 里面下包。

4. 使用本地 npmrc + nrm。

有本地 npmrc 的时候,执行 nrm ls 输出的目录是 npmrc 上设置的目录。

5. 使用本地 npmrc + package-lock.json

这个分两种情况。

  • 直接执行 npm i 将从 package-lock 中获取文件的下载地址。

  • 如果执行的是 npm i <package> 将从 npmrc 中获取下载地址,并更新 package-lock。

6. npm i chai –registry https://registry.yarnpkg.com/

效果与只使用 .npmrc 一致。

总结

.npmrc 的配置文件与 package-lock.json 的配置文件优先级是比较高的。 其次才是 nrm 的配置项。

nrm 其实是设置了 global 的 npmrc。项目下的 npmrc 肯定优先级更高一些。

node.js – npm package.json和docker(挂载……)

node.js – npm package.json和docker(挂载……)

我正在使用Docker,所以这种情况可能看起来很奇怪.但我希望我的整个/ data目录在开发时安装在我的docker容器中.

我的/ data文件夹容器是我的package.json文件,一个app目录和一堆其他的东西.
问题是我希望我的node_modules文件夹不是持久的,只是package.json文件.

我尝试了几件事,但是package.json和npm给了我很难的时间……

>直接挂载package.json文件会破坏npm. npm尝试在保存时重命名文件,这在安装文件时是不可能的.
>挂载父文件夹(/ data)将挂载node_modules文件夹.
>我找不到任何配置选项将node_modules放在/ data,example / dist之外的另一个文件夹中
>将package.json放在/ data / conf中将/ data / conf作为卷安装而不会工作.我找不到任何方法来指定npmrc中的package.json路径.
>将package.json放在/ data / conf中并将其符号链接到/data/package.json不会工作. npm打破符号链接并用文件替换它.

在docker容器内来回传输数据是我现在正在做的事情..有点乏味……我也想要一个干净的解决方案..

最佳答案
正如您已经回答的那样,我认为这可能是目前唯一的解决方案.

在构建Docker镜像时,请执行以下操作:

copY data/package.json /data/
RUN mkdir /dist/node_modules && ln -s /dist/node_modules /data/node_modules && cd /data && npm install

而对于其他东西(如凉亭,做同样的事情)

copY data/.bowerrc /data/
copY data/bower.json /data/
RUN mkdir /dist/vendor && ln -s /dist/vendor /data/vendor && cd /data && bower install --allow-root

最后还是copY数据/ /数据(因此,当数据发生变化时,您可以使用Dockers缓存而不必进行npm / docker安装.

您还需要创建所需的符号链接并将它们存储在您的git-repo中.它们在外部无效,但会在容器内部发挥作用.

使用此解决方案,您可以安装$PWD / data:/ data而无需在容器外部获取npm / bower“垃圾”.您仍然可以将您的映像构建为服务的独立部署.

node.js – yarn.lock和npm的shrinkwrap有什么区别?

node.js – yarn.lock和npm的shrinkwrap有什么区别?

最近我尝试用Yarn安装我的Node包.它运行良好,比NPM快得多.纱线自动生成yarn.lock.我们已经有了NPM shrinkwrap(npm-shrinkwrap.json).

它们之间有什么区别吗?
yarn.lock比npm-shrinkwrap.json有什么优势吗?

解决方法

yarn.lock文件与其他包管理器的锁文件非常相似,特别是Rust的Cargo包管理器,它有Cargo.lock.这些锁定文件的想法是表示应该始终有效的一致的包.

npm在package.json文件中存储依赖项范围,这意味着当有人安装您的软件包时,它们可能会获得一组不同的依赖项,因为您可能正在运行过时的软件包(尽管它们仍然满足您指定的依赖项范围).例如,指定依赖项“foo”的人:“^ 1.0.0”.他们可能实际安装了foo v1.0.1,因为这是他们运行npm install时的最新版本,但稍后,有人会安装你的软件包并获得依赖关系foo v1.1.0.这可能会意外地破坏某些内容,如果您有一个yarn.lock文件可以保证一致的包解析,则可以避免这种情况.

至于与npm shrinkwrap的比较,the documentation非常清楚地解释了:

It’s similar to npm’s npm-shrinkwrap.json,however it’s not lossy and it creates reproducible results.

文档还建议将yarn.lock提交到您的存储库,如果您还没有这样做,那么您可以获得一致且可重现的包解析的好处. This question还解释了为什么要这样做.

npm shrinkwrap的有损行为是由npm本身使用的非确定性算法引起的;正如另一个答案的评论所述,npm shrinkwrap> npm install> npm shrinkwrap不能保证产生与仅一次收缩包装相同的输出,而Yarn明确使用“an install algorithm that is deterministic and reliable”.

node.js – 有没有办法确认package-lock.json实际上解析了package.json中的所有依赖项?

node.js – 有没有办法确认package-lock.json实际上解析了package.json中的所有依赖项?

我们希望向CI服务器添加一个自动检查,以防止代码被提交以更新package.json中的依赖项,但不会更新package-lock.json中已解析的依赖项.

例如,如果某人手动更新了package.json中的依赖项但运行了npm install而不是npm update(npm install favors package-lock.json,如果存在),则可能会发生这种情况.或者,即使有人在更新依赖项时运行正确的npm命令,但是忘记将结果更改提交到package-lock.json,也可能发生这种情况.我们尝试在代码审查中观察这些内容,但自动检查肯定会更好.是否有任何npm命令执行此操作?

这是一个例子来说明.

之前:

// package.json
{
    "lodash": "~3.1.0"
}

// package-lock.json
{
    "dependencies": {
       "lodash": {
           "version": "3.1.3"
       }
    }
}

有人更新了package.json,但忘记将更改提交到package-lock.json.

后:

// package.json
{
    "lodash": "~3.2.0"
}

// package-lock.json (not changed)
{
    "dependencies": {
       "lodash": {
           "version": "3.1.3"
       }
    }
}

现在,package-lock.json不再反映package.json文件的有效依赖项解析集.

解决方法

运行 npm ls似乎为您执行此操作,因为它会因 package.json与其 lock之间的差异而引发错误.在节点脚本中,您可以使用节点 child_process.exec或.execSync执行此操作.如果您想要包含有用的消息,Async似乎更干净:

const cp = require("child_process");
const verify = () => cp.exec("npm ls",error => {
  if (error) {
    console.error("Dependency mismatch between package.json and lock. Run: npm install");
    throw error;
  }
  console.log("Dependencies verified =)");
});

或者为了简单起见,您可以在安装npm之前在CI中的某个位置运行npm ls.

关于npm-shrinkwrap.json 和 package-lock.json 有什么区别?package.json和package-lock.json的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于(全局npmrc)nrm、npmrc、package-lock.json 的优先级、node.js – npm package.json和docker(挂载……)、node.js – yarn.lock和npm的shrinkwrap有什么区别?、node.js – 有没有办法确认package-lock.json实际上解析了package.json中的所有依赖项?等相关知识的信息别忘了在本站进行查找喔。

本文标签: