Table of contents:
- π Quick Start (local development)
- π Continuous Delivery
- π¦ Options
- Compatibility overview with Nx
- π Configuration File
- π§ Essential considerations
- π Do you Want to Contribute?
- License
- Recognitions
-
Add
ngx-deploy-npmand configure one library at a time with--projectand--dist-folder-path:npm install --save-dev ngx-deploy-npm npm exec nx generate ngx-deploy-npm:install --project=your-library --dist-folder-path=dist/libs/your-libraryRepeat the generator for each library you want to publish. There is no bulk
--projectsinstall. -
Deploy your library to NPM with all default settings.
nx deploy your-library --dry-run
-
When you are happy with the result, remove the
--dry-runoption
You can publish from CI in two ways:
- OIDC trusted publishing (recommended for GitHub Actions) β short-lived credentials from your workflow; no long-lived
NPM_TOKEN. See npm trusted publishing. - NPM token β classic automation token written to
.npmrc. Create one via the NPM web page ornpm token create.
-
Configure a trusted publisher on npmjs.com
- Open your package on npm β Settings β Trusted publishing.
- Choose GitHub Actions and set the Organization/user, Repository, and Workflow filename (e.g.
publish.ymlβ filename only, including.yml). - If you use a GitHub environment (e.g.
production), enter the same name in npm. - Ensure the
repositoryfield in the publishedpackage.jsonmatches your GitHub repo URL.
-
Grant OIDC permissions in the workflow
permissions: id-token: write # required for npm OIDC contents: read
-
Build, then deploy with
ngx-deploy-npmTrusted publishing requires npm CLI v11.5.1+. The executor runs
npm publishfor you β noNPM_TOKENis needed when OIDC is configured.# .github/workflows/publish.yml name: Publish on: push: branches: - main jobs: publish: runs-on: ubuntu-latest environment: production # optional; must match npm trusted publisher if set permissions: id-token: write contents: read steps: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: node-version: '22' # Do not set registry-url here unless you also provide NODE_AUTH_TOKEN # for private dependency installs β an empty token blocks OIDC publish. - run: npm ci - run: npx nx build your-library - run: npx nx deploy your-library
When publishing with OIDC from a public repository, npm adds provenance attestations automatically. To disable them, set
NPM_CONFIG_PROVENANCE=falseon the deploy step. -
Scoped packages, custom registries, and
.npmrc-
For scoped packages on the public registry, set
"access": "public"in the deploy target or pass--access=public. -
For a custom registry, use the deploy
--registryoption or set it in the project'sdeploytarget options. -
Add a repo-level
.npmrcwhen you need registry defaults, for example:@my-org:registry=https://registry.npmjs.org/Or for GitHub Packages:
@my-org:registry=https://npm.pkg.github.com
OIDC trusted publishing applies to
npm publishon the registry you configure; private dependency installs may still need a read-onlyNODE_AUTH_TOKENonnpm ci(see npm docs). -
-
Enjoy your just-released package ππ¦
This repo publishes with OIDC in .github/workflows/publishment.yml β no NPM_TOKEN secret.
@jscutlery/semver bumps the version from your commits and can chain build and deploy via postTargets. Configure a version target on your library (see this repo's project.json):
"version": {
"executor": "@jscutlery/semver:version",
"options": {
"postTargets": ["build", "deploy"]
}
}In CI, a single command bumps, builds, and publishes:
permissions:
id-token: write # omit if using NPM_TOKEN instead (see below)
contents: read
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0 # required by semver to read commit history
- uses: actions/setup-node@v6
with:
node-version: '22'
- run: npm ci
- run: npx nx version your-libraryIf you are not using OIDC trusted publishing yet, store an automation token as NPM_TOKEN and pass it through setup-node:
# .github/workflows/publish.yml
name: Publish
on:
push:
branches:
- main
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: '22'
registry-url: 'https://registry.npmjs.org'
- run: npm ci
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- run: npx nx build your-library
- run: npx nx deploy your-library
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}With semver, pass NODE_AUTH_TOKEN on the npx nx version your-library step instead of separate build/deploy steps.
| Symptom | Likely cause | Fix |
|---|---|---|
ENEEDAUTH with OIDC configured on npm |
setup-node wrote //registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN} but NODE_AUTH_TOKEN is empty, so npm skips OIDC |
Omit registry-url from setup-node on the publish job, or supply a read-only token only on npm ci |
| OIDC publish rejected | Trusted publisher workflow filename, repo, or environment does not match npm settings | Match npm Trusted publishing fields exactly (case-sensitive .yml filename) |
| OIDC publish rejected from a fork | repository in package.json still points at the upstream repo |
Align repository.url with the repo that runs the workflow |
-
Set the env variable
- On your project setting the env variable. Let's call it
NPM_TOKEN
- On your project setting the env variable. Let's call it
-
Indicate how to find the token
- Before publishing, we must indicate to npm how to find that token,
do it by creating a step with
run: echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' > YOUR_REPO_DIRECTORY/.npmrc - Replace
YOUR_REPO_DIRECTORYfor the path of your project, commonly is/home/circleci/repo
- Before publishing, we must indicate to npm how to find that token,
do it by creating a step with
-
(Optional) check that you are logged
- Creating a step with
run: npm whoami - The output should be the username of your npm account
- Creating a step with
-
Deploy your package
-
Create a step with:
nx deploy your-library
-
-
Enjoy your just-released package ππ¦
The complete job example is:
# .circleci/config.yml
jobs:
init-deploy:
executor: my-executor
steps:
- attach_workspace:
at: /home/circleci/repo/
# Set NPM token to be able to publish
- run: echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' > /home/circleci/repo/.npmrc
- run: npm whoami
- run: npx nx deploy YOUR_PACKAGEYou can check the steps suggested in the CircleCI's guide
- required
- Example:
nx generate ngx-deploy-npm:install --project=lib-1 --dist-folder-path="dist/libs/lib-1"
Indicates the dist folder path. The path where is located the bundle of your library. The path should be relative to the project's root.
- required
- Example:
nx generate ngx-deploy-npm:install --project=lib-1 --dist-folder-path="dist/libs/lib-1"βlib-1will be configured. It will create the target deploy with the default options on the projectlib-1.
Specify which library should be configured.
- optional
- Default:
public - Example:
nx generate ngx-deploy-npm:install --access=restricted --project=lib-1 --dist-folder-path="dist/libs/lib-1"
Tells the registry whether to publish the package as public or restricted. It only applies to scoped packages, which default to restricted. If you don't have a paid account, you must publish with --access public to publish scoped packages.
- required
- Example:
nx deploy --dist-folder-path='dist/libs/my-project'
Indicate the dist folder path. The path must relative to project's root.
- optional
- Example:
nx deploy --check-existing=warningnx deploy --check-existing=errornx deploy --check-existing=skip
Check if the package version already exists before publishing.
If it exists and --check-existing=warning, it will skip the publishing and log a warning.
If it exists and --check-existing=error, it will throw an error.
If it exists and --check-existing=skip, it will skip the publishing silently (useful in CI).
- optional
- Default:
false(boolean) - Example:
nx deploy --check-existing=warning --check-tag
When set, the duplicate version check only runs when publishing to a non-latest tag.
Publishing with the default latest tag (or without --tag) skips the check even if --check-existing is set.
- optional
- Example:
nx deploy --package-version 2.3.4
It's going to put that version on your package.json and publish the library with that version on NPM.
- optional
- Default:
latest(string) - Example:
nx deploy --tag alphaβ Your package will be available for download using that tag,npm install your-package@alphauseful for RC versions, alpha, betas.
Registers the published package with the given tag, such that npm install @ will install this version. By default, npm publish updates and npm install installs the latest tag. See npm-dist-tag for details about tags.
- Default:
public(string) - Example:
nx deploy --access public
Tells the registry whether to publish the package as public or restricted. It only applies to scoped packages, which default to restricted. If you don't have a paid account, you must publish with --access public to publish scoped packages.
- optional
- Example:
nx deploy --otp TOKEN
If you have two-factor authentication enabled in auth-and-writes mode, you can provide a code from your authenticator.
- optional
- Example:
nx deploy --registry http://localhost:4873
Configure npm to use any compatible registry you like, and even run your own registry.
- optional
- Default:
false(boolean) - Example:
nx deploy --dry-run
For testing: Run through without making any changes. Execute with --dry-run, and nothing will happen. It will show a list of the options used on the console.
| Version | Nx Workspace Version |
|---|---|
| v9.1.0 | >=19.x |
| v9.0.0 | >=19.x <21.x |
| v8.4.0 | >=16.x <20.x |
| v8.2.0 | >=16.x <19.x |
| v8.1.0 | >=16.x <18.x |
| v8.0.0 | >=16.x <17.x |
| v7.1.0 | >=16.x <17.x |
| v7.0.1 | 16.x |
To avoid all these command-line cmd options, you can write down your
configuration in the project.json file in the options attribute
of your deploy project's executor.
Just change the option to lower camel case.
A list of all available options is also available here.
Example:
nx deploy your-library --tag alpha --access public --dry-runbecomes
"deploy": {
"executor": "ngx-deploy-npm:deploy",
"options": {
"tag": "alpha",
"access": "public",
"dryRun": true
}
}Now you can just run nx deploy YOUR-LIBRARY without all the options in the command line! π
βΉοΈ You can always use the --dry-run option to verify if your configuration is correct.
This deployer doesn't bump or generate a new package version; here, we care about doing one thing well, publish your libs to NPM. You can change the version package at publishment using the --package-version option.
We strongly recommend using @jscutlery/semver to generate your package's version based on your commits automatically. When a new version is generated you can specify to publish it using ngx-deploy-npm.
For more information go to semver's documentation
We use @jscutlery/semver here on ngx-deploy-npm to generate the package's next version, and we use ngx-deploy-npm to publish that version to NPM. Yes, it uses itself, take a look by yourself ngx-deploy-npm/project.json
The install generator configures a single project per invocation (--project + --dist-folder-path). Run it again for each library you publish.
We create a unique document for you to give you through this path.
Code released under the MIT license.
- π Initially Powered By ngx-deploy-starter
