背景
- Typescript で書いたライブラリを使いたい
- リモートに保存しておきたい
- NPM で公開するまででもない
- GitHub Packages すらもめんどくさい
という方向けの記事になります。
基本的に、パッケージというのは Typescript で書かれたものであれば Javascript にコンパイルされていなければいけないので、ライブラリとして利用するためにはコンパイルされたパッケージとして利用する必要があるわけです。
ぶっちゃけるとコンパイルしたファイル自体をコミットすれば動くといえば動くのですが、流石にそれはアレなので生成物は同梱しないようにしてそれを実装します。
スクリプトを利用する
package.json
には通常のスクリプトとは別にpre
やpost
のプレフィックスを付けることで任意のタイミングでスクリプトを実行することができます。
それについてはこの記事が比較的わかりやすく書いてくれているので、これを読むと良いと思います。
で、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"
}
}
こうすると少なくとも自分の環境ではエラーが発生せずにソースコードからビルドしてライブラリとして取り込むことができました。
記事は以上。