【问题标题】:NodeJS and NPM : problems following recommendation to check modules into gitNodeJS 和 NPM:建议将模块检入 git 后出现的问题
【发布时间】:2012-03-02 19:56:41
【问题描述】:

我在遵循“官方”建议将所有外部依赖项签入 git 时遇到问题(文章 http://www.mikealrogers.com/posts/nodemodules-in-git.html 链接来自常见问题解答)

  1. 如何确保不仅签入顶级依赖项?大多数 npm 模块目前不遵循建议。他们都有自己的 node_modules 在 .gitignore 。只是删除他们的 .gitignore 似乎有风险。

  2. 对于已编译的模块,本文建议仅签入源代码并运行“npm rebuild”和部署时间。不幸的是,'npm rebuild' 并没有对所有模块进行'clean make'(尽管我正在使用的 npm 版本 1.0.106 中包含错误修复 https://github.com/isaacs/npm/issues/1872)。这意味着我必须防止编译目标被签入(否则我将在生产机器上为开发人员机器编译目标代码,而不会被 npm rebuild 覆盖)。但是:我该怎么做?不幸的是,这些模块没有通用的编译输出目录,所以只需 git 忽略“node_modules//build”和“/node_modules//out/”(正如这篇好文章 eng.yammer 中所述.com/blog/2012/1/4/managing-nodejs-dependencies-and-deployments-at-yammer.html 并非在所有情况下都有帮助。

短版:您如何确保生产服务器使用与您在开发期间使用的所有依赖模块完全相同的版本?

【问题讨论】:

标签: node.js npm


【解决方案1】:

更新:现在有npm shrinkwrap 解决了锁定精确依赖版本的问题,甚至是依赖的依赖! More info here.

签入node_modules 可能会出现问题,因为它运行的环境可能因用户而异 - 因此在某些环境中编译的内容可能无法在其他环境中运行。另外,它会用 3rd 方代码填充您的变更日志和存储库。我认为这是您对问题的简短版本得出的结论,所以让我来解决这个问题。

短版:您如何确保生产服务器使用与您在开发期间使用的所有依赖模块完全相同的版本?

在您的package.json 中,会有dependencies: {},如果不存在,则添加它。要完成您想要的,请将您的依赖项添加为键,并将它们的确切版本添加为值。例如。 dependencies: { docpad: '2.5.0', mocha: '1.1.0' }

但是,通常(取决于作者)对修订号(x.x.X 号)的升级只是错误修复和安全的。您可以通过dependencies: { docpad: '2.5.x', mocha: '1.1.x' } 允许进行细微更改,这样您就不必更新您的 package.json 并在每次有错误修复版本时进行发布。如果您愿意,您甚至可以执行 2.x 之类的操作。

这是我用于所有模块的解决方案,因为它确保即使在 6 个月后或任何模块仍然可以工作 - 而像 >= 2.0.0 这样的操作意味着当依赖项的 v3 出现时,您的模块届时可能无法使用。确保您坚持使用特定版本“保证”随着时间推移的稳定性。

For reference you can see how I've done it in my open-source node.js modules here

【讨论】:

  • 谢谢。我已经在 package.json 中设置了不同的版本,就像你描述的那样。但这仅与我的顶级依赖项有关。我无法控制依赖项的依赖关系。
  • Ohhhhh 是的...我所做的几次对抗就是更改依赖项并提交拉取请求,同时发布您自己的风格直到它正式发布合并。例如。将docpad 更改为docpad-bal 之类的,并在原始项目中引用您自己的风格。合并后取消发布。
  • 添加了对刚刚发布的 npm shrinkwrap 的引用,它解决了您所说的问题 @user1194821
【解决方案2】:

关于你的依赖项的 .gitignore(在“node_modules”中),npm 1.1 会忽略 .gitignore 文件,因此不会安装它们;

npm 1.1 will exclude .gitignore files from the things it installs. 
npm 1.0 did not have this feature, so you have to be careful about that. 
Deleting them recursively is fine: 
    find node_modules -name .gitignore | xargs rm 
But, in npm 1.1, you never have to do this, because it excludes them 
from the install automatically. 

这是来自酋长本人 (Isaac) 和 it's here 并且似乎涵盖了几乎所有内容。我遇到的“无关”问题一定是我做过的愚蠢的事情,我会尝试一个干净的设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-26
    • 1970-01-01
    • 2013-05-06
    • 2016-07-22
    • 2015-09-12
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多