在构建后或部署期间在 ngsw 中重新生成内容哈希

Posted

技术标签:

【中文标题】在构建后或部署期间在 ngsw 中重新生成内容哈希【英文标题】:Regenerate content hash in ngsw after build or during deploy 【发布时间】:2019-06-03 03:41:27 【问题描述】:

我们有一个使用 Angular Service Worker 的 Angular 应用程序。

正如我们所知,这个 Service Worker 将缓存文件中的内容哈希值与 ngsw.json 文件中的哈希值进行比较。

现在,我们已经设置了持续集成和交付(使用 Azure DevOps,但应该没关系),在交付阶段,我们正在修改 environment.json 文件中的一些设置(如配色方案、API url ...都与部署目标有关)。问题是,通过修改该 json 文件,哈希不再与 ngsw.json 文件中该文件的哈希匹配。

我们绝对不想为专门的目标环境重建,因为这违背了 CI/CD 的目的。 (一旦包进入 QA 流程,您不希望为生产环境重新构建包)。

所以问题是:在我们修改environment.json(或任何其他)文件后,有没有办法在ngsw.json 文件中重新生成哈希?或者这个问题有其他解决方案吗?

【问题讨论】:

希望我能更多地支持这一点,如果我要更改的只是配置,我不想为每个环境重建我的应用程序,并且我不想包含npm install 步骤每个版本都只是为了构建这个小小的 ngsw-config 实用程序,我希望它是 Angular CLI 的一部分! 【参考方案1】:

另一种无需交付整个 Angular CLI 包即可更新 ngsw.json 中的哈希值的方法是使用这个小型开源工具仅重新创建哈希值。

wget https://github.com/dev-jan/ngsw-rehash/releases/download/v1.0/ngsw-rehash-linux-x86 -o ngsw-rehash
chmod +x ngsw-rehash
ngsw-rehash <path-to-dist>/ngsw.json

它是一个没有任何依赖关系的小型独立二进制文件。来源可以在这里找到:https://github.com/dev-jan/ngsw-rehash

我创建这个工具是因为我遇到了同样的问题,并且不想使用 ngsw-config 工具来保持我的最终 Docker 映像很小并且没有很多不需要的二进制文件。

【讨论】:

【参考方案2】:

你说的是以下命令吗:

node_modules/.bin/ngsw-config dist src/ngsw-config.json

您可以将命令放在您的 package.json 中:

  "scripts": 
    "ngsw-config": "node_modules/.bin/ngsw-config dist src/ngsw-config.json"
  

这将为您重做配置和哈希。 在你的最终命令之后运行它,这在你的 CI 环境中应该是可能的。

还请注意,如果您使用其中之一,它可以采用基本 href 参数。

更多解释在这里:Angular doc

【讨论】:

如果你有一个单独的发布管道怎么办?我是否必须引入整个 Angular CLI? @AaronTurkel 你会的,但你不需要 ng build --prod 等吗? 我们设置了每次推送都会创建一个我们存储的产品构建。到了发布的时候,我们就抓住那个 dist。但是标记化发生在发布步骤中,所以我需要重新创建哈希表。尝试仅复制脚本,但看起来它依赖于 angular cli 包的其他部分。 @AaronTurkel 是的,你需要整个 CLI 才能做到这一点。

以上是关于在构建后或部署期间在 ngsw 中重新生成内容哈希的主要内容,如果未能解决你的问题,请参考以下文章

在构建期间生成 ramdisk 并填充内容

RuntimeError:在 Rack 中的迭代期间无法将新密钥添加到哈希中

在重新部署 .ear 文件期间未执行 Liquibase 脚本[关闭]

如何使 Git 提交哈希在 C++ 代码中可用而无需重新编译?

是否可以在 Azure DevOps 的构建管道期间下载文件?

在构建期间自动化 xsd.exe