Есть ли способ расширить конфигурации в angular.json?

При создании приложения Angular 6 мне нужно указать сразу две вещи:

  • Если это производство или разработка построить
  • Я использую язык

В моем angular.json у меня есть:

"build": {
  ...
  "configurations": {
    "production": {
      "fileReplacements": [
        {
          "replace": "src/environments/environment.ts",
          "with": "src/environments/environment.prod.ts"
        }
      ],
      "optimization": true,
      "outputHashing": "all",
      "sourceMap": false,
      "extractCss": true,
      "namedChunks": false,
      "aot": true,
      "extractLicenses": true,
      "vendorChunk": false,
      "buildOptimizer": true
    },
    "pl": {
      "fileReplacements": [
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/pl.json"
        }
      ]
    },
    "en": {
      "fileReplacements": [
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/en.json"
        }
      ]
    }
  }
}

Но когда я делаю ng build --configuration=en --configuration=production, я получаю ошибку Configuration 'en,production' could not be found. Я так понимаю, это означает, что вы можете указать только 1 конфигурацию за раз.

Это означает, что мне нужно создать отдельные конфигурации en, pl, productionEn, productionPl. Хотя это и не самая чистая картина, я могу жить с этим.

"build": {
  ...
  "configurations": {
    "production": {
      "fileReplacements": [
        {
          "replace": "src/environments/environment.ts",
          "with": "src/environments/environment.prod.ts"
        }
      ],
      "optimization": true,
      "outputHashing": "all",
      "sourceMap": false,
      "extractCss": true,
      "namedChunks": false,
      "aot": true,
      "extractLicenses": true,
      "vendorChunk": false,
      "buildOptimizer": true
    },
    "pl": {
      "fileReplacements": [
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/pl.json"
        }
      ]
    },
    "en": {
      "fileReplacements": [
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/en.json"
        }
      ]
    },
    "productionPl": {
      "fileReplacements": [
        {
          "replace": "src/environments/environment.ts",
          "with": "src/environments/environment.prod.ts"
        },
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/pl.json"
        }
      ],
      "optimization": true,
      "outputHashing": "all",
      "sourceMap": false,
      "extractCss": true,
      "namedChunks": false,
      "aot": true,
      "extractLicenses": true,
      "vendorChunk": false,
      "buildOptimizer": true
    },
    "productionEn": {
      "fileReplacements": [
        {
          "replace": "src/environments/environment.ts",
          "with": "src/environments/environment.prod.ts"
        },
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/en.json"
        }
      ],
      "optimization": true,
      "outputHashing": "all",
      "sourceMap": false,
      "extractCss": true,
      "namedChunks": false,
      "aot": true,
      "extractLicenses": true,
      "vendorChunk": false,
      "buildOptimizer": true
    }
  }
}

Но я не могу жить с этим, копируя и вставляя все содержимое конфигурации production в productionEn и productionPl. Если я добавлю еще больше локалей или какой-то третий отдельный аспект, который я хотел бы указать во время сборки, этот шаблон станет настоящим кошмаром для обслуживания. К сожалению, похоже, что шаблон, который команда Angular рекомендует в своей документации.

Есть ли способ сообщить Angular CLI, что productionEn расширяет production, чтобы не дублировать один и тот же код конфигурации несколько раз? Что-то вроде кода ниже:

"build": {
  ...
  "configurations": {
    "production": {
      (...)
    },
    "pl": {
      "extends": "production",
      (...)
    },
    "en": {
      "extends": "production",
      (...)
    }
  }
}

Ответ 1

angular.json некоторые проблемы и документацию angular.json, кажется, что options действуют как значения по умолчанию для проекта

"architect": {
        "build": {          
          "options": {...}

Они переопределены partial параметрами, заданными в configurations. Из рабочей области Угловой CLI wiki:

configurations (object): A map of alternative target options.
configurationName (object): Partial options override for this builder.

В этом выпуске комментария также упоминается использование configurations в качестве переопределения

Это похоже на то, что все параметры по умолчанию для проекта могут быть добавлены к объекту options например, переместите любые дубликаты из production, productionPl в options: {}, а затем добавьте fileReplacements и несколько других переопределений, которые вам нужны

Примечание. Я еще не тестировал это, это просто предложение, основанное на документах и проблемах

Ответ 2

Наконец, есть способ сделать это, указав несколько конфигураций в командной строке:

ng build --configuration=en,production

Актуальная проблема

Ответ 3

вы спрашиваете?

"scripts": {
    [...]
    "build-i18n": "for lang in en es fr pt; 
       do ng build --config=$lang;
       done"
 }