我正在使用基于NPM的工具(grunt
)构建HTML5前端。
我的持续集成构建过程的第一步是运行npm install
。
npm install
SLOW 。即使使用本地NPM代理缓存工件(Sonatype的Nexus 3),它仍然需要4分钟!
$> time npm install
real 4m17.427s
user 0m0.170s
sys 0m0.290s
如果我按照惯常的最佳实践进行持续集成,我将从一个原始的SCM存储库开始运行构建。这意味着,每次CI构建都必须进行新的npm install
并承担4分钟的费用。
这是我构建时间的重要比例。我不满意这种构建需要很长时间。
替代方案似乎是在构建之间保持node_modules
。但是,我遇到了构建变得不稳定的问题。
从package.json
删除依赖关系并不会使用简单的node_modules
将其从npm install
中删除。我可以首先使用npm prune
解决此问题。
这里被认为是最佳做法?
答案 0 :(得分:1)
考虑到为了构建您必须安装新软件包,您别无选择,只能调用install。至于原始,我坚信他们是指“构建”过程而不是“依赖管理”过程。
为什么他们不一样?让我们通过一个例子来说明它。
作为开发人员,当你第一次开始工作时,你必须“安装” 能够编码的软件。这通常做一次。 之后,您可以开始编码。后者是“构建”部分 因为您为代码生成的每个功能生成了价值。从 有时,您可以通过删除,添加或更新工具列表来更新工具列表。
在这个例子中,在开始编码之前每天安装工具都会很糟糕。
我建议您确保构建过程(即生成工件(例如Jar))与依赖项安装过程分离。意味着安装完成一次,建筑可以毫无困难地进行。你没有提到将要建造的东西,但是咕噜声可以肯定地完成其余的工作。
因此,我认为修剪和安装是一个很好的策略。你不应该担心第一次。把它想象成一个冷酷的开始。任何使用子组件作为管道一起工作的系统都有这个“问题”。以汽车为例。当你开始它时,它会像你在一小时后开车时一样省油。
答案 1 :(得分:0)
安排每日作业以构建包含依赖项的docker容器。在最新的容器中运行CI作业。伪像CI作业的构建。
答案 2 :(得分:0)
您应该在本地计算机或本地网络中离线安装npm
个软件包,您可以在这里找到一些提示=> Offline installation of npm packages
答案 3 :(得分:0)
您是否考虑过使用npm link甚至是整个node_modules文件夹的符号链接? 至少npm链接可用于您的dev依赖项,您通常需要服务器上的受控版本。这应该可以加快速度。
答案 4 :(得分:0)
自2018年3月5日和npm 5.7.1起,您可以使用npm ci
。这比常规的npm install
快得多,因为它忽略了一些用户友好的功能并为无用户CI环境安装了软件包。