やっと理解したのでメモ
何がしたいか
- 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な方もどうぞ。