并行运行Angular i18

时间:2019-06-05 14:08:34

标签: angular npm webpack angular-cli

我在Angular应用程序中支持11种语言,并且正在使用Angular的内置国际化(XLF文件)。永远需要发布(因为它会构建11次应用!)。如何并行运行构建任务(我有4核CPU)?

2 个答案:

答案 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秒,总时间几乎没有变化。我想我的服务器资源已经在顺序构建中用完了,因此并行构建不会增加太多。