Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并行运行Angular i18构建_Angular_Npm_Webpack_Angular Cli - Fatal编程技术网

并行运行Angular i18构建

并行运行Angular i18构建,angular,npm,webpack,angular-cli,Angular,Npm,Webpack,Angular Cli,我的Angular应用程序支持11种语言,我正在使用Angular的内置国际化(XLF文件)。发布一个应用程序需要花费很长时间(因为它构建了11次应用程序!)。如何并行运行构建任务(我有一个4核CPU)?因为我不想在将来添加新语言时进行代码更改(我想是DevOps友好的方法!),所以我最终编写了一个shell脚本(DevOps将使用该脚本): 然后添加了i18n npm任务: "build:i18n": "bash $PROJECT_ROOT/i18n.sh $LANGS", 以及: ng b

我的Angular应用程序支持11种语言,我正在使用Angular的内置国际化(XLF文件)。发布一个应用程序需要花费很长时间(因为它构建了11次应用程序!)。如何并行运行构建任务(我有一个4核CPU)?

因为我不想在将来添加新语言时进行代码更改(我想是DevOps友好的方法!),所以我最终编写了一个shell脚本(DevOps将使用该脚本):

然后添加了i18n npm任务:

"build:i18n": "bash $PROJECT_ROOT/i18n.sh $LANGS",
以及:

ng build命令末尾的符号是分叉新的进程,这正是使其并行的原因。我能够获得60%的构建时间改进

通过这种方式,DevOps在添加对新语言的支持时需要做的就是将转换xlf文件添加到资产中(在我们的例子中,转换xlf文件单独托管在AWS S3 bucket中),然后使用新的语言环境更新LANGS环境变量,最后触发构建任务(无代码更改)

编辑:


还需要在for循环的末尾添加“wait”命令,以等待所有任务完成。

有关文档:我在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
    }
}

然而:使用顺序构建,1个AOT构建耗时3分钟30秒,5个地区总共约18分钟。使用上述脚本,1个AOT构建需要15分钟30秒,总时间基本不变。我猜在我的例子中,服务器资源已经在顺序构建中耗尽,因此并行构建不会增加太多。

您可以在package.json中创建一个npm脚本,并将这些构建与一个
|
或npm run all模块相结合,然后该模块将并行运行所有构建。请看这里:。这可以工作,但不是一个任务中有11个管道。除了每一种新添加的语言,都会有代码更改,我更感兴趣的是devops级别的解决方案。看来您要求的是Angular团队正在修复的开放式解决方案。显然,他们自己也在谷歌遇到了这个问题,所以希望他们能在不久的将来提出一个解决方案。60%的改进,非常值得尊敬。解决方案@Wildhammer做得不错!谢谢我有一个4线程的核心i7。如果是monster服务器进行构建,可能会更糟。是的,这完全取决于您的CI/CD实例类型和大小。自从我写这篇文章以来,我们实际上已经将我们的平台迁移到Kubernetes,现在我们支持18种语言。我现在使用的是用于构建的docker映像(将区域设置作为输入,捆绑作为输出),并将各个区域设置构建作业分散到我们的机器上。根据集群中可用的机器数量,使用这种方法,理论上18个构建可以与一个构建一样快。
LANGS= en de fr ...
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
    }
}