Я влюблен в NX mono-repo tool, а что тут не любить? Удивительная интеграция с Angular и Nestjs, вычислительное кэширование, многоязычные/мультипроектные инструменты управления, Консоль NX VSC и, конечно же, NX CLI. С CLI вы можете упростить свою работу, используя массу генераторов плагинов и запуска целевых конфигураций!

Сегодня я покажу вам базовый способ расширения функциональности этих целей запуска без необходимости создавать собственные, используя пользовательские аргументы/флаги.

Первая очень популярная цель — <app>:serve, чтобы передать пользовательские аргументы, вам нужно обернуть значения в --args=:

nx run api:serve --args='--env=develop' # single value

Если вы хотите передать несколько значений, просто разделите их запятой внутри строки:

nx run api:serve --args='--env=develop,--locale=en' # multiple values

Следующая популярная цель — <app>:build, вы можете передавать значения напрямую как обычные параметры:

nx run api:build --env=develop # single value
nx run api:build --env=develop --locale=en # multiple value

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

// project.json
... 
"build-seed": {
   "executor": "@nrwl/node:webpack",
   "outputs": ["{options.outputPath}"],
   "options": {
     "outputPath": "dist/apps/api",
     "main": "apps/api/src/main-seeder.ts",
     "tsConfig": "apps/api/tsconfig.app.json",
     "assets": ["apps/api/src/assets"]
   },
   "configurations": {
     "production": {
       "optimization": true,
       "extractLicenses": true,
       "inspect": false,
       "fileReplacements": []
    }
  }
 },  
"seed": {
   "executor": "@nrwl/workspace:run-commands",
   "options": {
     "commands": [
       "nx run api:build-seed:production",
       "node dist/apps/api/main.js"
    ],
    "parallel": false
  }
}
...

Теперь эти флаги доступны в процессе node dist/apps/api/main.js, так что я могу раздавать в зависимости от окружения, локали и т. д.

Теперь ваш объект process в вашем процессе узла будет иметь доступ к этому значению в process.argv. Это будет массив строк, поэтому вам придется анализировать и/или манипулировать значениями, используя что-то вроде этого:

export function parseNxArgs(processArgv: typeof process.argv /* string[] */) {
  return processArgv.reduce<Record<string, string>>((agg, arg) => {
    if (arg.indexOf('--') !== -1) {
      let val = arg.replace('--', '').split('=');
      if (val[0] && val[1]) agg[val[0].trim()] = val[1]; // make sure to remove white spaces
    };
    return agg;
  } , {});
}

В вашем коде теперь вы можете использовать:

const parsedValues = parseNxArgs(process.argv);
// parsedValues.myArg
// parsedValues.myArg2
// parsedValues...

Не забудьте проверить nx.dev и использовать его для создания следующего интересного проекта.

Надеюсь, вам понравилась эта статья так же, как и мне (это была моя первая!), и если вы нашли ее полезной или неправильной, пожалуйста, не стесняйтесь оставлять мне комментарии!