TypeScript ライブラリ制作の勉強の一環で、@s-inoue0108/mdcli
というパッケージを作っています。このツールの紹介がてら、npm パッケージとして開発するうえで躓いた部分を忘れないうちに残しておこうと思います。
@s-inoue0108/mdcli
Command line tool for management Markdown (.md) file.. Latest version: 0.1.22-alpha, last published: a day ago. Start using @s-inoue0108/mdcli in your project by running `npm i @s-inoue0108/mdcli`. There are no other projects in the npm registry using @s-inoue0108/mdcli.

## 参考
zenn-cli
という OSS をかなり参考にしました。これは Zenn↗ が提供する CLI ツールで、記事をローカルの Markdown で管理できるようになります。
zenn-cli
Preview Zenn content locally.. Latest version: 0.1.159, last published: 13 days ago. Start using zenn-cli in your project by running `npm i zenn-cli`. There are no other projects in the npm registry using zenn-cli.

今回のパッケージは、zenn-cli
からプレビュー機能(フロントエンド部分)を除いた形をモデルとして開発しています。
また、パッケージングにあたってはこれらの記事を参考にしています。
npm パッケージを TypeScript で自作して公開、別モジュールからインストールして使うまでの手順

Node パッケージ を npmjs に公開するうえで知っておくべきこと

## tsconfig.json をつくる
今回はトランスパイル済みの JS のみを npm のリポジトリに流したいので、dist
ディレクトリにビルド生成物を吐くように設定します。
tsconfig.json
"outDir": "./dist"
## npm パッケージ化する
package.json
を生成して、中身をいじります。
npm init
package.json
{
"name": "@s-inoue0108/mdcli",
"version": "0.1.0",
"description": "hogehoge",
"main": "dist/mdcli.js",
"scripts": {
"build": "tsc",
"prepare": "npm run build",
},
"type": "module",
"author": "Shota Inoue",
"license": "MIT",
"publishConfig": {
"access": "public"
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "git+https://github.com/s-inoue0108/mdcli.git"
},
}
一部のフィールドの説明を書いておきます。
main
- エントリポイントとなるファイルのパスを記述します。
scripts
- npm スクリプトを設定します。
prepare
を設定しておくと、npm install
やnpm publish
時に設定値のスクリプトが実行されます(publish
時にトランスパイルしてくれる)。
- npm スクリプトを設定します。
files
npm install
時にnode_modules
にロードするディレクトリやファイルを指定できます(ホワイトリスト)。対照的に、.npmignore
はブラックリストの役割を果たします。パッケージ使用時はトランスパイル済みの JS しかいらないためこのような設定にしています。
ひととおり設定したら、以下のコマンドでパッケージを公開します。@username
で名前空間をつけてあるパッケージは access=public
でのみ公開できます。
npm publish
### package.json の細かい設定
zenn-cli
は npm install
した直後に npx zenn init
で初期化することができます。このような挙動は、エントリポイントとなる JS へのエイリアスを package.json
の bin
フィールドに貼ることで達成できます。
package.json
"bin": {
"zenn": "dist/mdcli.js"
}
また、package.json
はユーザー定義のフィールドを使用することもできます。