我正在开发一个 Web 应用程序(JavaScript/C#,由 TFS 控制的版本),我们的团队希望开始使用 Visual Studio 2015。Microsoft 正在插入开发人员使用现有的流行工具(如 Gulp)来执行自动化任务,所以我'我们已经编写了一些将在服务器上运行的 Gulp 任务。
我的问题是我们的自动构建会在构建服务器上生成新的项目文件夹,因此如果不先运行 npm install
,我就无法运行 gulp myBuildTask
。 npm install 为构建过程增加了 2 多分钟,并且为每个构建下载相同的依赖项似乎非常低效(因为它们很少更改)。
我是否可以在不先运行 npm install
的情况下在新项目文件夹上运行 Gulp 任务?
我考虑过的选项:
在 TFS 中包含 node_modules。我无法将 node_modules 文件夹添加到 TFS(这会导致它存在于每个新构建文件夹中),因为 Bower 的嵌套依赖项具有文件路径Windows 太长了。我可以在没有 bower 的情况下走这条路,但我不确定我是否需要我的解决方案中的所有这些文件(其中大部分是不需要的,例如自述文件和测试文件)。
运行
npm install
在每次自动构建之后。 如前所述,我不想这样做,因为它会增加构建过程的几分钟时间。全局安装 NPM 模块。 我不确定这是否可能,但我想知道我是否可以在构建服务器上全局安装所有项目依赖项(避免必须在项目级别安装)。我对这种方法的担忧是,我不想每次添加 gulp 插件时都必须手动更新构建服务器的全局安装的 NPM 模块。
理想情况下,解决方案类似于#3。这些模块将全局安装,但每个构建都可以运行 npm install
来验证每个模块是否已安装。如果一个新的 npm 模块被添加到 package.json,它将被下载。这个 npm install
会非常快,因为在大多数情况下,所有模块都已经存在(全局安装在构建服务器上)。
最佳答案
您可能会做一些事情:
使
npm install
运行得更快。为此,请使用最新的npm
(如果可能)或使用npm dedupe
。与普通的npm install
相比,运行dedupe
可能会减少依赖性。然后运行 npm shrinkwrap
创建npm-shrinkwrap.json
文件,其中包含有关在npm install< 期间安装的内容(以及版本)的“卡住”信息
。请记住,
node_modules
只是一个目录,如果您可以将其复制/rsync 到您的安装中,则可以完全跳过npm install
阶段Node包解析方法是先尝试本地node_modules目录,如果不成功,(node_modules不存在或node_modules中缺少依赖)检查父目录的node_modules,然后是祖父目录等。这意味着,您不必全局安装包,半全局安装就足够了
:
my_project
node_modules/
dependency1
dependency2
build_001/
build_002/
build_00x/
no node_modules here,
no deps here
但是请注意,这自然只有在您的依赖关系确实没有改变时才有效。由于在现实生活中您会不时安装新的东西,稍微增强的方法可能会有所帮助:按如下方式组织您的目录:
my_project
ver_af729b
node_modules
build_001
build_002
ver_82b5f3
node_modules
build_003
build_004
af729b
和 82b5f3
是您的 npm-shrinkwrap.json
文件的(前缀)sha 哈希。如果您随后添加新的依赖项,shrinkwrap 文件会更新,构建脚本会创建新的 ver_something 目录并在其中执行 npm install
。完成所有这些工作自然需要额外的工作,但应该会很有效。
----------------编辑--------------------
如果你不想完全避免 npm install
(你只是想让它快点),你可以坚持典型的场景:你总是将源代码 check out 到同一个目录,然后让 npm install
尽可能重用旧的 node_modules
。
如果你总是想为你的构建创建一个新目录,你仍然可以创建一个 node_modules
符号链接(symbolic link)到旧版本的 node_modules
- 同样在这种情况下,npm将尽可能多地从符号链接(symbolic link)文件夹中重用。
关于node.js - 在没有 npm install 的情况下使用 gulp 进行构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34681284/