Nx - это набор расширяемых инструментов разработки для монорепозиториев, который мы в Nrwl разработали на основе нашего опыта работы в Google и помогая Fortune 500 создавать амбициозные приложения Angular.

Мы выпустили Nx 6.0 месяц назад, и сегодня мы рады объявить о выпуске Nx 6.1, который содержит множество улучшений для удобства использования и исправлений ошибок.

Создание и тестирование одного проекта против создания и тестирования множества проектов

С помощью Angular CLI мы можем создавать, тестировать и линтировать индивидуальный проект следующим образом:

ng build myapp
ng test myapp
ng test mylib
ng lint myapp
ng lint mylib
ng e2e myapp-e2e

Запуск ng build|test|lint без указания имени проекта не позволяет передавать параметры (например, ng build --prod приведет к ошибке), что делает эти команды пригодными для использования только с одним проектом.

Nx может здесь помочь. Следующая команда построит / тестирует / lint все проекты в нашем репозитории.

yarn affected:build --all
yarn affected:test --all
yarn affected:lint --all
yarn affected:e2e --all

И мы можем передавать параметры, например: yarn affected:build --all --prod.

Разумное строительство

В Nrwl мы рекомендуем людям использовать разработку в стиле монорепозитория (подробнее здесь), аналогично тому, как Google, Facebook и многие другие компании создают программное обеспечение. В результате может получиться репозиторий, содержащий десятки приложений и сотни библиотек. Восстановление и повторное тестирование всех из них каждый раз, когда мы вносим изменения, не масштабируются. Вот почему --all следует использовать редко.

Чтобы показать, как Nx может улучшить этот опыт, представьте, что у нас есть репозиторий с двумя приложениями и тремя библиотеками.

Теперь предположим, что мы отошли от мастера и внесли изменение в код. Мы не заинтересованы в восстановлении и повторном тестировании всего - нас интересует только восстановление и повторное тестирование проектов, на которые может повлиять наше изменение. Мы можем сделать это следующим образом:

yarn affected:build --base=master
yarn affected:test --base=master
yarn affected:lint --base=master
yarn affected:e2e --base=master

При использовании --base Nx будет смотреть на изменения кода в нашей ветке (включая как зафиксированные, так и незафиксированные изменения). Затем Nx будет использовать свой анализ кода, чтобы выяснить, на что могут повлиять изменения кода, и повторно выполнит только минимальный набор необходимых команд.

Скажем, например, мы изменили libs / lib1 / src / index.ts. После анализа репо Nx повторно протестирует только следующие проекты:

Полезный совет: запустите команду «yarn blocked: dep-graph --base = master», чтобы узнать, на что влияет ваш PR.

При работе в CI часто необходимо указать и базу, и головку. Мы можем сделать это следующим образом:

yarn affected:build --base=origin/master --head=HEAD
yarn affected:test --base=origin/master --head=HEAD
yarn affected:lint --base=origin/master --head=HEAD
yarn affected:e2e --base=origin/master --head=HEAD

Внося серьезные изменения в большую кодовую базу, мы не хотим повторно тестировать все затронутые проекты снова и снова. Вероятно, мы хотим повторно протестировать только те, которые не прошли в прошлый раз. С Nx это просто:

yarn affected:build --base=master --only-failed
yarn affected:test --base=master --only-failed
yarn affected:lint --base=master --only-failed
yarn affected:e2e --base=master --only-failed

Наконец, мы можем запустить --help, чтобы увидеть все доступные параметры, поддерживаемые командами affected:*.

yarn affected:build --help
yarn affected:test --help
yarn affected:lint --help
yarn affected:e2e --help

Масштабирование

Большинство изменений кода в Nx Workspace повлияют только на несколько проектов, поэтому их пересборка и повторное тестирование обычно выполняется довольно быстро. Однако некоторые изменения кода значительны и могут привести к перестройке всего репозитория. Чтобы ускорить этот процесс, мы улучшили поддержку параллелизма в Nx 6.1.

yarn affected:build --base=master --parallel
yarn affected:test --base=master --parallel
yarn affected:lint --base=master --parallel
yarn affected:e2e --base=master --parallel

Мы также можем передать --maxParallel, чтобы указать количество параллельных процессов.

Неявные зависимости

Nx использует свой встроенный интеллект для создания графа зависимостей приложений и библиотек, который используется для определения того, что необходимо перестроить и протестировать. Однако есть определенные файлы, которые Nx не может проанализировать. Вот почему Nx поддерживает неявные зависимости. Они определены в nx.json.

{
  "npmScope": "mycompany",
  "implicitDependencies": {
    "package.json": "*",
    "angular.json": "*",
    "tsconfig.json": "*",
    "tslint.json": "*",
    "nx.json": "*"
},
projects: {}
}

Строка ”package.json”: “*” сообщает Nx, что изменение в package.json повлияет на каждый отдельный проект. Поскольку файла README корневого уровня нет в списке, его изменение ни на что не повлияет.

Мы можем быть более конкретными и перечислить проекты, на которые повлияет конкретный файл.

{
  "npmScope": "mycompany",
  "implicitDependencies": {
    "package.json": "*",
    "angular.json": "*",
    "tsconfig.json": "*",
    "tslint.json": "*",
    "nx.json": "*",
    
    "tools/scripts/app1-rename-bundles.js": ["app1"]
  },
  projects: {}
}

Попробуйте!

Создание новой рабочей области

Установите новую версию Nx, запустив: yarn global @nrwl/schematics. Затем создайте новое рабочее пространство, запустив ng new myorg --collection=@nrwl/schematics.

Или добавьте возможности Nx в существующий проект Angular CLI, используя ng add @nrwl/schematics.

Если ваши глобально установленные пакеты npm находятся в плохом состоянии, запустите create-nx-workspace myorg, который создаст новое рабочее пространство с использованием изолированной среды.

Обновление с Nx 6.0

Если вы уже являетесь пользователем Nx 6, обновите свое рабочее пространство до Nx 6.1, запустив ng update @nrwl/[email protected].

Обновление с Nx 1.x

Если вы уже являетесь пользователем Nx 1.x, обновите свое рабочее пространство для использования Nx 6.1, запустив yarn add @nrwl/schematics@latest --dev (или npm install @nrwl/schematics@latest — save-dev) для установки новой версии Nx, а затем запустив yarn update (или npm run update).

Процесс обновления Nx зависит от процесса обновления Angular CLI. Поскольку Angular CLI 1.7 и Angular CLI 6 во многом отличаются, процесс обновления не идеален, поэтому после выполнения команды обновления может потребоваться несколько изменений.

Мы сделали все возможное, чтобы справиться с наиболее распространенными настройками. Но если вы думаете, что мы можем сделать больше, сообщите о проблеме на странице http://github.com/nrwl/nx.

Учить больше

Виктор Савкин - соучредитель Nrwl. Мы помогаем компаниям развиваться, как Google, с 2016 года. Мы предоставляем консультации, инжиниринг и инструменты.

Если вам это понравилось, нажмите 👏 ниже, чтобы другие люди увидели это здесь, на Medium. Подпишитесь на @victorsavkin, чтобы узнать больше о монорепозиториях, Nx, Angular и React.