没有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任务?

我考虑的选项:

  1. 在TFS中包含node_modules。 我无法将node_modules文件夹添加到TFS(这会导致它存在于每个新的生成文件夹中),因为bower的嵌套依赖项的文件path对于Windows来说太长了。 我可以没有凉亭走这条路线,但我不确定我想在我的解决scheme中的所有这些文件(其中大部分是不需要的,如自述和testing文件)。

  2. 每次自动构build后 运行 npm install 如前所述,我不想这样做,因为它增加了几分钟的构build过程。

  3. 全局安装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 

af729b82b5f3是(你的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将尽可能地从符号链接文件夹重新使用。