我正在使用Web应用程序(
JavaScript / C#,由TFS控制的版本),我们的团队希望开始使用Visual Studio 2015.微软正在让开发人员使用像Gulp这样的现有流行工具进行自动化任务,所以我写了一篇很少会在服务器上运行的Gulp任务.
我的问题是我们的自动构建在构建服务器上生成了新的项目文件夹,因此如果没有先运行npm install,我就无法运行gulp myBuildTask. npm安装增加了超过2分钟的构建过程,并且为每个构建下载相同的依赖项似乎非常低效(因为它们很少会改变).
无论如何我可以在没有首先运行npm install的情况下在新项目文件夹上运行Gulp任务吗?
我考虑的选项:
>在TFS中包含node_modules.我无法将node_modules文件夹添加到TFS(这会导致它存在于每个新的构建文件夹中),因为bower的嵌套依赖项具有对Windows而言太长的文件路径.我可以在没有凉亭的情况下走这条路,但我不确定我是否想在我的解决方案中使用所有这些文件(其中大部分都不需要,如自述文件和测试文件).
>在每次自动构建后运行npm install.
如前所述,我不想这样做,因为它为构建过程增加了几分钟.
>全局安装NPM模块.
我不确定这是否可能,但我想知道我是否可以在构建服务器上全局安装所有项目依赖项(避免在项目级别安装).我对这种方法的关注是,我不希望每次添加gulp插件时都必须手动更新构建服务器的全局安装的NPM模块.
理想情况下,解决方案就像#3.这些模块将全局安装,但每个构建都可以运行npm install,它将验证每个模块是否已安装.如果将新的npm模块添加到package.json中,则会下载它.这个npm安装速度非常快,因为在大多数情况下,所有模块都已经存在(全局安装在构建服务器上).
最佳答案 你可能会做一些事情:
>使npm安装运行得更快.为此,请使用最新的npm(如果可能)或使用npm重复数据删除.与普通的npm安装相比,运行重复数据删除可能会导致依赖性降低.然后运行npm shrinkwrap,它创建npm-shrinkwrap.json文件,其中包含有关在npm安装期间确切安装(以及在哪个版本中)的内容的“冻结”信息.
>请记住,node_modules只是一个目录,如果你可以将它复制/ rsync到你的安装,你可以完全跳过npm安装阶段
>节点包解析方法是首先尝试本地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安装(你只是希望它快速)你可以坚持典型的场景:你总是将源代码检出到同一目录,让npm install重新使用旧的node_modules.可能.
如果您希望始终为构建创建新目录,您仍可以为较旧版本的node_modules创建node_modules符号链接 – 在此方案中,npm将尽可能多地从symlinked文件夹中重用.