在VSTS中缓存npm install任务

6

我已经在VSTS中配置了一个私有代理,并在其中全局安装了NPM。当我尝试通过构建任务安装NPM时,它仍然会为每个构建安装NPM包,这需要很长时间-大约12分钟。

我该如何缓存NPM安装程序以减少构建时间?

4个回答

5
我们使用npm-cache,npm-cache是一个Node.js模块,它会为每个哈希值计算您的package.json文件,并在构建服务器上创建包含node_modules内容的zip文件夹。现在,npm install只需要在每次构建时解压缩zip文件夹(当然,只有在您实际未更改package.json的情况下才这样做)。
思路是:第一次下载工具时,它会将npm软件包保存到本地,第二次如果package.json没有变化,它将从本地磁盘获取软件包,并将其复制到构建代理文件夹中;只有当package.json发生更改时,它才会从互联网下载软件包。
操作步骤如下: 1. 在构建机器上安装npm-cache: npm install npm-cache -g 2. 在构建定义中添加命令行任务(工具:C:\Windows\User\AppData\Roaming\npm\npm-cache(或者如果您将该工具添加到环境路径变量中,则只需输入npm-cache);参数:install npm;工作文件夹:$(Build.SourcesDirectory) (或者package.json所在的位置)。

4

你验证过这个是否有效吗?我尝试了同样的方法,但是在查看构建日志后,npm ci 命令仍然被执行并且它只是覆盖了现有的缓存内容。也就是说,使用这种方法并没有节省任何时间。 - jrap
进一步测试-它仅缓存.npm目录,这是npm缓存。因此,这可以节省非常少的时间(基于我的测试项目)。但是,它确实在所有运行中运行命令npm ci。为了避免执行脚本,您需要使用CacheBeta输入cacheHitVar,然后将condition添加到脚本任务中。 - jrap
@jrap 我已经测试过了,是的。而且我也没有看到任何明显的性能提升。至少因为从 MS 服务器下载缓存需要(几乎相同的)时间。 - Andrey Stukalin

0

使用缓存任务

使用缓存管道任务可以将缓存添加到管道中。此任务与其他任务一样,添加到作业的步骤部分。

使用以下配置:

pool:
  name: Azure Pipelines

steps:
- task: Cache@2
  inputs:    
    key: 'YOUR_WEB_DIR/package.json'
    path: 'YOUR_WEB_DIR/node_modules/'

- task: Npm@1
  inputs:
    command: 'install'
    workingDir: 'YOUR_WEB_DIR/frontend'

您也可以使用键 YOUR_WEB_DIR/package-lock.json,但请注意该文件可能会被其他步骤(如npm install)更改,因此哈希值也会更改。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接