npm.jsでPrivate Packageを運用する時のあれこれ
GitHub PackageでPrivateのものを社内運用する〜みたいな情報はいっぱいあるけど、npm.jsのPrivate Packageは意外とないよね〜ということで書いていきます。
Yarnのberryがラクダヨ!
Yarnのberryがおすすめ
(というよりこのスクラップはそれ前提で書いていきます。
具体的には、yarn@4.1.0
を使ってます。
.yarnrc.yml
の記述例
yarnPath
とnodeLinker
はどうでもよくて、npmAuthToken
が重要です。
これを書くと、Yarnくんがよしなにやってくれます。
NPM_TOKEN
の値は、環境変数から渡す感じになっています。
その方がデプロイとかCI/CDで取り回しやすいからね。
ローカル環境はIDEのTerminal Enviroment Value的なところから設定してください()
yarnPath: .yarn/releases/yarn-4.1.0.cjs
nodeLinker: node-modules
npmAuthToken: ${NPM_TOKEN}
CI/CDの記述例
GitHub Actions + (Eslint, Stylelint)想定です。
name: Test (Eslint, Stylelint)
on:
push:
branches: [ '*' ]
pull_request:
branches: [ '*' ]
workflow_dispatch:
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
jobs:
setup:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '20'
- name: Cache Dependencies
id: yarn_cache
uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
- name: Install Dependencies
if: steps.yarn_cache.outputs.cache-hit != 'true'
run: yarn install
eslint:
runs-on: ubuntu-latest
needs:
- setup
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '20'
- name: Restore Cache Dependencies
uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
- name: Eslint Check
run: yarn eslint
stylelint:
runs-on: ubuntu-latest
needs:
- setup
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '20'
- name: Restore Cache Dependencies
uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
- name: Stylelint Check
run: yarn stylelint
ミソは、言わずもがなNPM_TOKEN: ${{ secrets.NPM_TOKEN }}
です。
GitHubのレポジトリの設定から、NPM_TOKENを設定してあげればそれ以外に特に設定も必要ありません。
ここで注意点
yarnで各種コマンドを実行するには、環境変数(この場合はNPM_TOKEN
)が必要です。
上記例で、yarn install
だけにNPM_TOKEN
を設定せずに、Workflow全体に環境変数を適応しているのはこのような理由があります。
yarn --help
をするのにも環境変数が必要です()
PublishするPrivate Package側
name: Publish Package to npmjs
on:
push:
branches:
- main
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '20.x'
registry-url: 'https://registry.npmjs.org'
- name: Cache Dependencies
id: npm_cache
uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
- name: Install Dependencies
if: steps.yarn_cache.outputs.cache-hit != 'true'
run: yarn install --prefer-offline
- name: Publish Package to npmjs
run: |
git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
npm version patch
git push
# npm publish --provenance
npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package.jsonのversionが重複するとエラーを吐いてしまうので、npm version patch
でパッチレベルでバージョンを変えてPUSHしてから、npm publish
をしてます。
このCI / CD自体には下記の問題点があるので、実際使ったりする場合は注意 & 改善を(
1, パッチレベルのバージョン以外変えられない
npm publish
とパッチレベルのバージョンを変える処理が一体化しているので、他のバージョンを変える〜みたいなのが難しいです。
npm publish
する前に次のPushをmainブランチにするとエラーを吐く
2, npm publish
をする直前に、package.json
のversionを変える処理が入っています。
その影響で、versionの変更をレポジトリにCI / CDがPushした後に、次の自らの変更をレポジトリにPushしないとバージョンが重複してしまいます。
Publishする側はyarnのバージョンはなんでもあまり労力は変わらないので、お好きなものを()
この例では、1系のClassicを使ってます。(Berryを使うなら--prefer-offline
を消してね