依赖项更新后使用缓存的 npm 构建失败
Build failing with cached npm after dependency updates
我有一个管道执行 npm install
然后 angular 构建,最近我添加了一个缓存任务来减轻安装,在开发人员添加新的私有依赖项 "runtime-config-loader": "^3.0.0"
.
这可能需要重新安装 npm,但是,出于某种原因,缓存任务认为它不需要重新安装,因此它跳过了 npm install
,然后在 angular 构建,很可能是因为 npm 没有在代理上重新安装。
我禁用了缓存任务并从 npm install
任务中删除了自定义条件 eq(variables['CACHE_RESTORED'],False)
,并且构建成功。
为什么缓存无法识别需要再次重新安装依赖项?以及如何删除缓存以便再次安装 npm?提醒一下,当我禁用缓存任务并在代理上再次重新安装 npm 时,构建成功 - 所以这肯定是一个缓存问题。
这里是 build YAML:
steps:
- task: Cache@2
displayName: 'npm Cache'
inputs:
key: 'npm | "$(Agent.OS)" | $(System.DefaultWorkingDirectory)/EE/Angular/package-lock.json'
path: '$(System.DefaultWorkingDirectory)/EE/Angular/node_modules'
cacheHitVar: 'CACHE_RESTORED'
restoreKeys: 'npm | "$(Agent.OS)"'
enabled: false
steps:
- task: Npm@1
displayName: 'npm install'
inputs:
command: custom
workingDir: EE/Angular
verbose: false
customCommand: 'install --legacy-peer-deps'
condition: eq(variables['CACHE_RESTORED'],False)
steps:
- task: Npm@1
displayName: 'npm custom: angular build'
inputs:
command: custom
workingDir: EE/Angular
verbose: false
customCommand: 'run-script build -- --prod'
旧 package.json 文件 构建 with 缓存工作正常与:
{
"name": "angular",
"version": "11.2.14",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "11.2.14",
"@angular/cdk": "10.2.3",
"@angular/common": "^11.2.14",
"@angular/compiler": "11.2.14",
"@angular/core": "11.2.14",
"@angular/forms": "11.2.14",
"@angular/localize": "11.2.14",
"@angular/platform-browser": "11.2.14",
"@angular/platform-browser-dynamic": "11.2.14",
"@angular/router": "11.2.14",
"@fortawesome/angular-fontawesome": "0.8.2",
"@fortawesome/fontawesome-svg-core": "^1.2.28",
"@fortawesome/free-brands-svg-icons": "^5.13.0",
"@fortawesome/free-regular-svg-icons": "^5.13.0",
"@fortawesome/free-solid-svg-icons": "^5.13.0",
"@ng-bootstrap/ng-bootstrap": "9.1.3",
"@ng-idle/core": "^10.0.0-beta.1",
"@ng-idle/keepalive": "^10.0.0-beta.1",
"@ng-select/ng-select": "7.0.0",
"css-what": "^5.0.1",
"hammerjs": "^2.0.8",
"highcharts": "9.1.2",
"highcharts-angular": "2.10.0",
"html2pdf.js": "0.9.3",
"jspdf": "^2.3.1",
"ng-multiselect-dropdown": "0.3.4",
"ngx-cookie-service": "11.0.2",
"rxjs": "^6.5.4",
"rxjs-compat": "^6.5.4",
"tslib": "^2.0.0",
"xmldom": "^0.5.0",
"zone.js": "~0.10.2"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.1102.14",
"@angular/cli": "11.2.14",
"@angular/compiler-cli": "11.2.14",
"@angular/language-service": "11.2.14",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3",
"@types/node": "^12.11.1",
"codelyzer": "^5.1.2",
"jasmine-core": "~3.5.0",
"jasmine-spec-reporter": "~5.0.0",
"karma": "^6.3.4",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~3.0.2",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0",
"protractor": "~7.0.0",
"ts-node": "~7.0.0",
"tslint": "~6.1.0",
"typescript": "4.1.2"
}
}
新建package.json文件:
{
"name": "angular",
"version": "11.2.14",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "11.2.14",
"@angular/cdk": "^11.2.13",
"@angular/common": "^11.2.14",
"@angular/compiler": "11.2.14",
"@angular/core": "11.2.14",
"@angular/forms": "11.2.14",
"@angular/localize": "11.2.14",
"@angular/platform-browser": "11.2.14",
"@angular/platform-browser-dynamic": "11.2.14",
"@angular/router": "11.2.14",
"@fortawesome/angular-fontawesome": "0.8.2",
"@fortawesome/fontawesome-svg-core": "^1.2.28",
"@fortawesome/free-brands-svg-icons": "^5.13.0",
"@fortawesome/free-regular-svg-icons": "^5.13.0",
"@fortawesome/free-solid-svg-icons": "^5.13.0",
"@ng-bootstrap/ng-bootstrap": "9.1.3",
"@ng-idle/core": "^11.1.0",
"@ng-idle/keepalive": "^11.0.3",
"@ng-select/ng-select": "^6.1.0",
"css-what": "^5.0.1",
"hammerjs": "^2.0.8",
"highcharts": "9.1.2",
"highcharts-angular": "2.10.0",
"html2pdf.js": "0.9.3",
"jasmine": "^3.8.0",
"jspdf": "^2.3.1",
"ng-multiselect-dropdown": "0.3.4",
"ngx-cookie-service": "11.0.2",
"runtime-config-loader": "^3.0.0",
"rxjs": "^6.6.0",
"rxjs-compat": "^6.5.4",
"tslib": "^2.0.0",
"xmldom": "^0.5.0",
"zone.js": "^0.11.3"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.1102.14",
"@angular/cli": "11.2.14",
"@angular/compiler-cli": "11.2.14",
"@angular/language-service": "11.2.14",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3",
"@types/node": "^12.11.1",
"codelyzer": "^6.0.0",
"jasmine-core": "^3.8.0",
"jasmine-spec-reporter": "~5.0.0",
"karma": "^6.3.4",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~3.0.2",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0",
"protractor": "~7.0.0",
"ts-node": "^8.3.0",
"tslint": "~6.1.0",
"typescript": "^4.1.5"
}
}
不行,因为新的依赖显然不在缓存中。 npm install
也没有 运行。因此在构建过程中缺少依赖项。
要修复它,您需要始终 运行 npm install
,因为您永远不知道是否有新的依赖项。此外,安装后,如果安装了新的依赖项,您应该更新缓存。
我有一个管道执行 npm install
然后 angular 构建,最近我添加了一个缓存任务来减轻安装,在开发人员添加新的私有依赖项 "runtime-config-loader": "^3.0.0"
.
这可能需要重新安装 npm,但是,出于某种原因,缓存任务认为它不需要重新安装,因此它跳过了 npm install
,然后在 angular 构建,很可能是因为 npm 没有在代理上重新安装。
我禁用了缓存任务并从 npm install
任务中删除了自定义条件 eq(variables['CACHE_RESTORED'],False)
,并且构建成功。
为什么缓存无法识别需要再次重新安装依赖项?以及如何删除缓存以便再次安装 npm?提醒一下,当我禁用缓存任务并在代理上再次重新安装 npm 时,构建成功 - 所以这肯定是一个缓存问题。
这里是 build YAML:
steps:
- task: Cache@2
displayName: 'npm Cache'
inputs:
key: 'npm | "$(Agent.OS)" | $(System.DefaultWorkingDirectory)/EE/Angular/package-lock.json'
path: '$(System.DefaultWorkingDirectory)/EE/Angular/node_modules'
cacheHitVar: 'CACHE_RESTORED'
restoreKeys: 'npm | "$(Agent.OS)"'
enabled: false
steps:
- task: Npm@1
displayName: 'npm install'
inputs:
command: custom
workingDir: EE/Angular
verbose: false
customCommand: 'install --legacy-peer-deps'
condition: eq(variables['CACHE_RESTORED'],False)
steps:
- task: Npm@1
displayName: 'npm custom: angular build'
inputs:
command: custom
workingDir: EE/Angular
verbose: false
customCommand: 'run-script build -- --prod'
旧 package.json 文件 构建 with 缓存工作正常与:
{
"name": "angular",
"version": "11.2.14",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "11.2.14",
"@angular/cdk": "10.2.3",
"@angular/common": "^11.2.14",
"@angular/compiler": "11.2.14",
"@angular/core": "11.2.14",
"@angular/forms": "11.2.14",
"@angular/localize": "11.2.14",
"@angular/platform-browser": "11.2.14",
"@angular/platform-browser-dynamic": "11.2.14",
"@angular/router": "11.2.14",
"@fortawesome/angular-fontawesome": "0.8.2",
"@fortawesome/fontawesome-svg-core": "^1.2.28",
"@fortawesome/free-brands-svg-icons": "^5.13.0",
"@fortawesome/free-regular-svg-icons": "^5.13.0",
"@fortawesome/free-solid-svg-icons": "^5.13.0",
"@ng-bootstrap/ng-bootstrap": "9.1.3",
"@ng-idle/core": "^10.0.0-beta.1",
"@ng-idle/keepalive": "^10.0.0-beta.1",
"@ng-select/ng-select": "7.0.0",
"css-what": "^5.0.1",
"hammerjs": "^2.0.8",
"highcharts": "9.1.2",
"highcharts-angular": "2.10.0",
"html2pdf.js": "0.9.3",
"jspdf": "^2.3.1",
"ng-multiselect-dropdown": "0.3.4",
"ngx-cookie-service": "11.0.2",
"rxjs": "^6.5.4",
"rxjs-compat": "^6.5.4",
"tslib": "^2.0.0",
"xmldom": "^0.5.0",
"zone.js": "~0.10.2"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.1102.14",
"@angular/cli": "11.2.14",
"@angular/compiler-cli": "11.2.14",
"@angular/language-service": "11.2.14",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3",
"@types/node": "^12.11.1",
"codelyzer": "^5.1.2",
"jasmine-core": "~3.5.0",
"jasmine-spec-reporter": "~5.0.0",
"karma": "^6.3.4",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~3.0.2",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0",
"protractor": "~7.0.0",
"ts-node": "~7.0.0",
"tslint": "~6.1.0",
"typescript": "4.1.2"
}
}
新建package.json文件:
{
"name": "angular",
"version": "11.2.14",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "11.2.14",
"@angular/cdk": "^11.2.13",
"@angular/common": "^11.2.14",
"@angular/compiler": "11.2.14",
"@angular/core": "11.2.14",
"@angular/forms": "11.2.14",
"@angular/localize": "11.2.14",
"@angular/platform-browser": "11.2.14",
"@angular/platform-browser-dynamic": "11.2.14",
"@angular/router": "11.2.14",
"@fortawesome/angular-fontawesome": "0.8.2",
"@fortawesome/fontawesome-svg-core": "^1.2.28",
"@fortawesome/free-brands-svg-icons": "^5.13.0",
"@fortawesome/free-regular-svg-icons": "^5.13.0",
"@fortawesome/free-solid-svg-icons": "^5.13.0",
"@ng-bootstrap/ng-bootstrap": "9.1.3",
"@ng-idle/core": "^11.1.0",
"@ng-idle/keepalive": "^11.0.3",
"@ng-select/ng-select": "^6.1.0",
"css-what": "^5.0.1",
"hammerjs": "^2.0.8",
"highcharts": "9.1.2",
"highcharts-angular": "2.10.0",
"html2pdf.js": "0.9.3",
"jasmine": "^3.8.0",
"jspdf": "^2.3.1",
"ng-multiselect-dropdown": "0.3.4",
"ngx-cookie-service": "11.0.2",
"runtime-config-loader": "^3.0.0",
"rxjs": "^6.6.0",
"rxjs-compat": "^6.5.4",
"tslib": "^2.0.0",
"xmldom": "^0.5.0",
"zone.js": "^0.11.3"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.1102.14",
"@angular/cli": "11.2.14",
"@angular/compiler-cli": "11.2.14",
"@angular/language-service": "11.2.14",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3",
"@types/node": "^12.11.1",
"codelyzer": "^6.0.0",
"jasmine-core": "^3.8.0",
"jasmine-spec-reporter": "~5.0.0",
"karma": "^6.3.4",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~3.0.2",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0",
"protractor": "~7.0.0",
"ts-node": "^8.3.0",
"tslint": "~6.1.0",
"typescript": "^4.1.5"
}
}
不行,因为新的依赖显然不在缓存中。 npm install
也没有 运行。因此在构建过程中缺少依赖项。
要修复它,您需要始终 运行 npm install
,因为您永远不知道是否有新的依赖项。此外,安装后,如果安装了新的依赖项,您应该更新缓存。