没有npm安装使用gulp进行构build
我正在一个Web应用程序(JavaScript / C#,由TFS控制的版本)中工作,我们的团队希望开始使用Visual Studio 2015.Microsoft正在将开发人员使用现有的stream行工具,如Gulp进行自动化任务,所以我写了一个几个将在服务器上运行的Gulp任务。
我的问题是,我们的自动生成生成生成服务器上的新项目文件夹,所以我不能运行gulp myBuildTask
没有首先运行npm install
。 npm安装会在构build过程中增加2分钟以上的时间,并且对于每个构build下载相同的依赖关系似乎效率很低(因为它们很less会改变)。
有没有反正我可以运行一个新的项目文件夹没有首先运行npm install
Gulp任务?
我考虑的选项:
-
在TFS中包含node_modules。 我无法将node_modules文件夹添加到TFS(这会导致它存在于每个新的生成文件夹中),因为bower的嵌套依赖项的文件path对于Windows来说太长了。 我可以没有凉亭走这条路线,但我不确定我想在我的解决scheme中的所有这些文件(其中大部分是不需要的,如自述和testing文件)。
-
每次自动构build后 运行
npm install
。 如前所述,我不想这样做,因为它增加了几分钟的构build过程。 -
全局安装NPM模块。 我不确定这是否可能,但我想知道是否可以在构build服务器上全局安装所有项目依赖项(避免在项目级安装)。 我对这种方法的担心是,我不想每次添加一个gulp插件时手动更新构build服务器的全局安装的NPM模块。
理想情况下,解决scheme就像#3。 这些模块将全局安装,但是每个构build都可以运行一个npm install
来validation每个模块的安装。 如果一个新的npm模块被添加到package.json中,它将被下载。 这个npm install
会很快,因为在大多数情况下,所有的模块都已经存在(全局安装在构build服务器上)。
有几件事你可以做:
-
使
npm install
运行更快。 为此,请使用最新的npm
(如果可能)或使用npm dedupe
。 运行dedupe
可能会导致比使用普通的npm install
更less的依赖性。 然后运行npm shrinkwrap
,它创buildnpm-shrinkwrap.json
文件,其中包含有关在npm install
期间正确安装(以及在哪个版本中)的“冻结”信息。 -
请记住,
node_modules
只是一个目录,如果你可以复制/ rsync到你的安装,你可以跳过npm install
阶段 -
节点包parsing方法是首先尝试本地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 82b5f3
前缀)。 如果添加新的依赖关系,则会更新shrinkwrap文件,生成脚本会创build新的ver_something目录并执行npm install
。 做这一切自然需要额外的工作,但它应该很好。
——————编辑——————-
如果你不是完全避免npm install
(你只是希望它很快),你可以坚持典型的情况:你总是检查源代码到同一个目录,让npm install
重新使用旧的node_modules
可能。
如果您想要始终为您的构build创build一个新目录,那么您仍然可以创build一个node_modules
符号链接到node_modules
版本的node_modules
– 同样在这种情况下,npm将尽可能地从符号链接文件夹重新使用。