やっと理解したのでメモ
何がしたいか
- npmパッケージを登録する時にcoffeeやtypescriptのコードをコミットせず生成したjsだけをアップロードしたい
- 自動生成したjsをgitで管理したくない
どうやるか
src/**
にソース、lib/**
に実体があるとする
.npmignore に npm にアップロードしたくないものを書く
src/
test/
examples/
.gitignore にバージョンコントロールしたくないコードを書く
lib/
package.json にnpmに登録する際のフックのスクリプトを書く。(この例はcoffee)
"scripts": {
"prepublish": "$(npm bin)/coffee -o lib -c src/*"
},
npmで公開する。これは mizchi/ardaの例
$ npm publish
> arda@0.13.1 prepublish /Users/mizchi/proj/arda
> $(npm bin)/coffee -o lib -c src/*
+ arda@0.13.1
注意点
npm publishしたときに .npmignoreが存在しない場合、.gitignoreでignoreされたファイルを自動的に使う。これのせいでprepublishされたファイルが.gitignoreされていた場合公開されない。npm prepublishで生成されたファイルを無視しないために、明示的に.npmignoreは必ず用意する必要がある。
ってのを下のIssue読んでて気づいた。
prepublish hook on package.json causes npm to publish empty packages · Issue #4778 · npm/npm
Misleading npm prepublish
docs · Issue #28 · npm/docs.npmjs.com
今までprepublishの挙動でめっちゃ悩んでいて、coffeeとjs両方コミットしていたけど、やっと解決しそう。
babelな方もどうぞ。