我在Angular应用程序中支持11种语言,并且正在使用Angular的内置国际化(XLF文件)。永远需要发布(因为它会构建11次应用!)。如何并行运行构建任务(我有4核CPU)?
答案 0 :(得分:1)
由于我不想更改代码以在将来添加新语言(我想是DevOps友好的方法!)我最终写了一个shell脚本(DevOps将使用):
for arg; do \
echo "Building for $arg"
ng build --output-path $PROJECT_ROOT/public/$arg \
--aot \
--prod \
--base-href /$arg/ \
--i18n-file $LANGUAGE_ASSETS_DIR/i18n/$arg.xlf \
--i18n-format xlf \
--i18n-locale $arg & \
done
wait
然后添加了i18n npm任务:
"build:i18n": "bash $PROJECT_ROOT/i18n.sh $LANGS",
和:
LANGS= en de fr ...
ng build命令末尾的&符分叉了新进程,这使它并行化。我能够将构建时间缩短60%。
通过这种方式,DevOps要做的就是添加对新语言的支持,就是将转换xlf文件添加到资产(在我们的案例中是单独托管在AWS S3存储桶中),然后使用新的语言环境更新LANGS环境变量。 (s)并最终触发构建任务(无需更改代码)。
编辑:
还需要在for循环的末尾添加“ wait”命令,以等待所有任务完成。
答案 1 :(得分:0)
对于文档:我在Jenkins管道中的上述处理方法
def knownLocales = ["en-CH","en-US","en-GB","de-CH","de-DE"]
def ngAotBuildMap = [:]
steps {
script {
for (aot_locale in knownLocales) {
// beware of how Groovy creates closures in loops
String aotLocaleClosure = "${aot_locale}"
ngAotBuildMap[aot_locale] = {
sh """
echo "Building locale ${aotLocaleClosure}"
cd $WORKSPACE/webclient
rm -R -f $WORKSPACE/webclient/dist/${aotLocaleClosure}/
ng build --no-progress --configuration=${params.PARAM_SPRING_PROFILE}-${aotLocaleClosure}
"""
}
}
// https://stackoverflow.com/questions/37333796/using-failfast-with-closure-map-breaks-parallel-step/37356318
ngAotBuildMap.failFast = true
parallel ngAotBuildMap
}
}
但是:使用顺序构建,一次AOT构建需要3分30秒,在5个语言环境中总共需要18分钟。使用上面的脚本,一次AOT构建需要15分30秒,总时间几乎没有变化。我想我的服务器资源已经在顺序构建中用完了,因此并行构建不会增加太多。