我已经在VSTS中配置了一个私有代理,并在其中全局安装了NPM。当我尝试通过构建任务安装NPM时,它仍然会为每个构建安装NPM包,这需要很长时间-大约12分钟。
我该如何缓存NPM安装程序以减少构建时间?
我已经在VSTS中配置了一个私有代理,并在其中全局安装了NPM。当我尝试通过构建任务安装NPM时,它仍然会为每个构建安装NPM包,这需要很长时间-大约12分钟。
我该如何缓存NPM安装程序以减少构建时间?
package.json
没有变化,它将从本地磁盘获取软件包,并将其复制到构建代理文件夹中;只有当package.json
发生更改时,它才会从互联网下载软件包。C:\Windows\User\AppData\Roaming\npm\npm-cache
(或者如果您将该工具添加到环境路径变量中,则只需输入npm-cache
);参数:install npm
;工作文件夹:$(Build.SourcesDirectory)
(或者package.json
所在的位置)。微软终于实现了这个功能(目前处于测试阶段)https://learn.microsoft.com/en-us/azure/devops/pipelines/caching/index?view=azure-devops#nodejsnpm
从那里开始:
variables:
npm_config_cache: $(Pipeline.Workspace)/.npm
steps:
- task: CacheBeta@0
inputs:
key: $(Build.SourcesDirectory)/package-lock.json
path: $(npm_config_cache)
displayName: Cache npm
- script: npm ci
使用缓存管道任务可以将缓存添加到管道中。此任务与其他任务一样,添加到作业的步骤部分。
使用以下配置:
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
)更改,因此哈希值也会更改。
很遗憾,目前我们无法缓存NPM安装,因为没有内置的功能。
不过已经有一个用户建议提交了这个功能:通过构建缓存提高托管构建代理的性能,而且VSTS团队似乎正在积极开发中...
npm ci
命令仍然被执行并且它只是覆盖了现有的缓存内容。也就是说,使用这种方法并没有节省任何时间。 - jrap.npm
目录,这是npm缓存。因此,这可以节省非常少的时间(基于我的测试项目)。但是,它确实在所有运行中运行命令npm ci
。为了避免执行脚本,您需要使用CacheBeta输入cacheHitVar
,然后将condition
添加到脚本任务中。 - jrap