Quantumleap
712 words
4 minutes
GitHub Packagesを使わずにプライベートパッケージを公開するまでの手順
2023-03-27

背景#

  • Typescript で書いたライブラリを使いたい
  • リモートに保存しておきたい
  • NPM で公開するまででもない
  • GitHub Packages すらもめんどくさい

という方向けの記事になります。

基本的に、パッケージというのは Typescript で書かれたものであれば Javascript にコンパイルされていなければいけないので、ライブラリとして利用するためにはコンパイルされたパッケージとして利用する必要があるわけです。

ぶっちゃけるとコンパイルしたファイル自体をコミットすれば動くといえば動くのですが、流石にそれはアレなので生成物は同梱しないようにしてそれを実装します。

スクリプトを利用する#

package.jsonには通常のスクリプトとは別にprepostのプレフィックスを付けることで任意のタイミングでスクリプトを実行することができます。

それについてはこの記事が比較的わかりやすく書いてくれているので、これを読むと良いと思います。

で、yarn installが実行されたあとでyarn postinstallが実行されるので、このタイミングでソースコードから自分をコンパイルするようなコードを書きます。

{
  "scripts": {
    "test": "jest",
    "build": "tsc",
    "format": "prettier --write 'src/**/*.ts'",
    "lint": "eslint \"{src, test}/**/*.ts\" --fix",
    "postinstall": "tsc"
  }
}

つまりは上のようなコードになるのですが、これだと@types/webpackがそもそものプロジェクトに入っているときなどに失敗したりします。原因はよくわからないのですが、型チェックが入っているとコケるようです。

コケない人もいると思うので、以下はコケた人向けの内容です。

tsc-transpile-only を利用する#

対策としては{ transpileOnly: true }webpack.config.jsに書き込むなどいろいろ方法はあるのですが、ライブラリ側がコンパイルが通っている時点で型チェックはできているとみなして、インストールする際には型チェックをしないようにします。

ところがtscには--transpile-onlyのようなオプションがないのでこのままだと何回やってもコンパイルが通りません。

なんとかならないのかと思っていたところtsc-transpile-onlyというライブラリを発見しました。どうも型チェックを無視してくれるパッチがあたったtscのようです。

というわけで、以下のように書き換えます。

{
  "scripts": {
    "test": "jest",
    "build": "tsc",
    "format": "prettier --write 'src/**/*.ts'",
    "lint": "eslint \"{src, test}/**/*.ts\" --fix",
    "postinstall": "tsc-transpile-only"
  }
}

こうすると少なくとも自分の環境ではエラーが発生せずにソースコードからビルドしてライブラリとして取り込むことができました。

記事は以上。

GitHub Packagesを使わずにプライベートパッケージを公開するまでの手順
https://fuwari.vercel.app/posts/2023/03/postinstall-build/
Author
tkgling
Published at
2023-03-27