In this guide we create a new workspace, add some packages and release them to npm.
The workspace name we use is nxpm-playground.
For this guide to work, the workspace name should be the name of the npm scope we use to publish the packages. If you don't have a npm org you can create one for free.
# Creating a new workspaceOpen a shell and navigate to the directory where you want to create the project.
Run the following command to start:
Copy yarn create nx-workspace nxpm-playground
When prompted, we select the empty preset:
Copy ❯ empty [ an empty workspace ]
web components [ a workspace with a single app built using web components ]
angular [ a workspace with a single Angular application ]
angular-nest [ a workspace with a full stack application ( Angular + Nest ) ]
react [ a workspace with a single React application ]
react-express [ a workspace with a full stack application ( React + Express ) ]
next.js [ a workspace with a single Next.js application ]
After that, we select the Nx CLI:
Copy ? CLI to power the Nx workspace
❯ Nx [ Extensible CLI for JavaScript and TypeScript applications ]
Angular CLI [ Extensible CLI for Angular applications. Recommended for Angular projects. ]
The installation will start and create our project in nxpm-playground
# Adding a GitHub repositoryOnce this is done we create a new repository and add it to the project. This is needed in order to publish the release to GitHub, including the changelog.
Copy cd nxpm-playground
git remote add origin git@github.com:beeman/nxpm-playground.git
# Getting a GitHub tokenCreate a personal access token with the repo scope selected.
We export this token as the GITHUB_TOKEN environment variable. This gives the release command access to publish the release.
Copy export GITHUB_TOKEN = < your-token >
# Adding Nx apps and librariesNext up we're going to add some Nrwl libraries which we'll use to create some apps and libs:
Copy yarn add -D @nrwl/angular @nrwl/node
Once this is done we create our web and api apps:
Copy nx g @nrwl/node:app api
nx g @nrwl/angular:app web --style scss --routing
Finally, we will create a library for both of our apps:
Copy nx g @nrwl/node:lib api-core --publishable
nx g @nrwl/angular:lib web-core --style scss --publishable
Make sure create your libraries with the --publishable flag, otherwise the release command will not recognize them!
# Building our projectsAt this point we're ready to build our project and release the packages.
Copy yarn nx run-many --target build --all
This will build all the 4 projects in our workspace.
Copy > NX Running target build for projects:
- api-core
- web-core
- api
- web
.. .. .. .
> NX SUCCESS Running target "build" succeeded
# Commit and push to GitHubCurrently, the release command expects a remove branch to exist. If this is not the case, it will fail.
Let's commit all changes and push them to github:
Copy git add .
git commit -m "feat: initial commit"
git push origin master
# Releasing our librariesOnce this is all in place, we are ready to publish the libraries api-core and web-core to npm.
First we need to install nxpm as a dev dependency:
Once that is in place, we will run the release command in dry-run mode:
Copy yarn nxpm release 1.0 .0 --dry-run
Initially, the command will fail with some errors:
Copy NXPM VALIDATE Using nx workspace: workspace.json
NXPM VALIDATE Found 2 libraries:
NXPM VALIDATE Found builder for api-core: @nrwl/node:package
NXPM VALIDATE Found builder for web-core: @nrwl/angular:package
NXPM ERROR Version "0.0.1" should be "0.0.0-development" in libs/api-core/package.json
NXPM ERROR License not defined in in libs/api-core/package.json
NXPM ERROR Version "0.0.1" should be "0.0.0-development" in libs/web-core/package.json
NXPM ERROR License not defined in in libs/web-core/package.json
NXPM Could not continue because of errors in the following packages:
[ 'api-core' , 'web-core' ]
NXPM Try running this command with the --fix flag to fix some common problems
NXPM ERROR Error validating packages
error Command failed with exit code 1 .
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Let's use the --fix flag to have nxpm fix the issues:
Copy yarn nxpm release 1.0 .0 --dry-run --fix
NXPM VALIDATE Using nx workspace: workspace.json
NXPM VALIDATE Found 2 libraries:
NXPM VALIDATE Found builder for api-core: @nrwl/node:package
NXPM VALIDATE Found builder for web-core: @nrwl/angular:package
NXPM ERROR Version "0.0.1" should be "0.0.0-development" in libs/api-core/package.json
NXPM FIXED Version set to "0.0.0-development" in libs/api-core/package.json
NXPM ERROR License not defined in in libs/api-core/package.json
NXPM FIXED License set to MIT in libs/api-core/package.json
NXPM VALIDATE Package @nxpm-playground/api-core is valid.
NXPM ERROR Version "0.0.1" should be "0.0.0-development" in libs/web-core/package.json
NXPM FIXED Version set to "0.0.0-development" in libs/web-core/package.json
NXPM ERROR License not defined in in libs/web-core/package.json
NXPM FIXED License set to MIT in libs/web-core/package.json
NXPM VALIDATE Package @nxpm-playground/web-core is valid.
NXPM VALIDATE Found 2 packages to release
After the packages are valid it's time to actually release them.
You will be asked several questions, answer all of them with Yes (or just hit enter)
Copy ? Commit ( Release 1.0 .0 ) ? Yes
? Tag ( 1.0 .0 ) ? Yes
? Push? Yes
? Create a release on GitHub ( Release 1.0 .0 ) ? Yes
Once the release is published to github, npm publish will be executed:
Copy 🔗 https://github.com/beeman/nxpm-playground/releases/tag/1.0.0
🏁 Done ( in 89s. )
npm notice
npm notice 📦 @nxpm-playground/api-core@1.0.0
npm notice == = Tarball Contents == =
npm notice .. .
npm notice == = Tarball Details == =
npm notice name: @nxpm-playground/api-core
npm notice version: 1.0 .0
npm notice package size: 815 B
npm notice unpacked size: 1.1 kB
npm notice shasum: ccd92142c8ca2afcf87af51cc49d8a5ed864d6e4
npm notice integrity: sha512-MNBRRnyrYCNO3 [ .. . ] hmBRJWKYoEaCQ ==
npm notice total files: 8
npm notice
+ @nxpm-playground/api-core@1.0.0
npm WARN lifecycle The node binary used for scripts is /var/folders/rr/n45jfj7130x1vdvcv4dywpvc0000gn/T/yarn--1589448482284-0.49769534594014986/node but npm is using /usr/local/Cellar/node@12/12.16.2_1/bin/node itself. Use the ` --scripts-prepend-node-path ` option to include the path for the node binary npm was executed with.
> @nxpm-playground/web-core@1.0.0 prepublishOnly .
> true
npm notice
npm notice 📦 @nxpm-playground/web-core@1.0.0
npm notice == = Tarball Contents == =
npm notice .. .
npm notice == = Tarball Details == =
npm notice name: @nxpm-playground/web-core
npm notice version: 1.0 .0
npm notice package size: 2.9 kB
npm notice unpacked size: 11.9 kB
npm notice shasum: 32f6bb1ed1cd30105f22a329a4352bb2f0d3b625
npm notice integrity: sha512-p7tF1BecQJXQ1 [ .. . ] e7szdOYGqZSqQ ==
npm notice total files: 25
npm notice
+ @nxpm-playground/web-core@1.0.0
NXPM SUCCESS It looks like we're all done here ! : )
Aaaand we're done! You can check the resulting packages
api-core and
api-web .
If you get stuck, feel free to ping me on discord or the Nrwl Community Slack .