我需要在CI工作中缓存哪些内容,以避免每次都重新编译ngcc?

50

使用Angular 9及其新的编译引擎IVY,我的CI构建时间显著增加。这当然是因为ngcc在许多模块上运行。

例如:

Compiling @angular/core : es2015 as esm2015

Compiling @angular/common : es2015 as esm2015

...

我原先以为ngcc会在node_modules中缓存编译后的库,但我的CI工作流却将node_modules缓存了下来,而且在每次构建时仍然需要进行编译,所以这说明并不是这样的。

为了避免在每次构建时都需要使用ngcc重新编译所有模块,应该缓存哪些路径?


我没有遇到同样的问题。当缓存 node_modules 时,我的构建时间从 360 秒降至 219 秒。你可能需要仔细检查你的缓存是否正常工作。也许你的缓存范围仅限于当前分支?如果是这种情况,第一次构建将重新生成 es2015 模块。之后就会快得多了。 - Christian Klemm
3
在你的 Circle-CI 配置中,缓存行看起来是什么样子?Ivy 构建缓存似乎驻留在node_modules/.cache(一个隐藏目录)中,因此 glob 模式可能会出错? - Rusty Shacleford
在我的情况下,ngcc缓存会在yarn install(或npm install)之后被删除。 - Eric Li
有人找到了这个问题的答案吗? - Adi
1
一种实现这个的方法是使用NxDevTools:https://nx.dev/ - Mateus Carniatto
请注意,使用 Angular 13,ngcc 不再编译 Angular(以及任何更新的库),这将极大地加快 CI!无需缓存。 - Bufke
3个回答

1

更新1:

如果你正在使用最新版本,那么硬编码的Ivy entry点已经从angular构建中被移除了。之前这个点是错误地硬编码在Angular init TS github code link里面的。

现在/latest版本可以直接执行以下操作:

ngcc --properties es2015 browser module main



对于旧版本,请参见更新1以获取更高版本的信息

ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points

或者在package.json中作为你构建的一部分。

{  
  "scripts": {    
    "postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points"
  }
}

一些引用配置将Travis配置为

# custom caching for .travis.yml
install:
- npm ci
# keep the npm cache around to speed up installs
cache:
  directories:
  - "$HOME/.npm"
# you can add other 

选项2:使用yarn或pnpm可以更快
pnpm install
// or
yarn install
// or
npm install --prefer-offline --no-audit

不建议使用 --create-ivy-entry-points - 31piy

0
简而言之,你不能这样做。当前版本的ngcc不会检查任何更改,并且在调用ngcc命令时始终重新编译所有包。这种情况可以通过angular linker在未来得到解决,但并不确定,肯定会提高构建时间。

-1

在每次运行之间保留package-lock.json和文件夹node_modules/。希望你不要每次都在全新的镜像上运行构建。

如果下一个CI版本中更新了package.jsonpackage-lock.json,则只会预处理和安装更新的内容,其他内容将不会再次安装。

关于package-lock.jsonnode_modules文件夹有各种不同的指南和禁忌。您可以在互联网上找到很多相关阅读材料,我不打算参与其中。

基本规则:保持package-lock.jsonnode_modules一起

基本上,如果满足以下条件之一,就会安装软件包(在package.json中提到):

  1. package-lock.json中没有条目
  2. 有比package-lock.json中输入的版本更新的版本可用
  3. 如果不再引用某个包,则将删除该包

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