2011-12-21 18 views
12

私はprivate npm reposのCoffeeScriptで構築されたアプリケーションを構築しています。デプロイメント言語に依存せず、各アプリケーションでCoffeeScriptのバージョンを指定できるように、CoffeeScriptを各ライブラリの依存として、npmインストール時にJavaScriptに組み込みます。npmにcoffeescriptをインストールする

npmのインストールはスタンドアロンのreposではうまく動作しますが、別のレポが構築されていることに依存するレポをインストールしようとすると失敗します。だから、

私はpackage.jsonこれ含みrepo-a、持っている場合:

"dependencies": { 
    "coffee-script": "~1.2.0" 
}, 
"scripts": { 
    "install": "./node_modules/coffee-script/bin/cake install" 
} 

repo-b、そのpackage.jsonこれが含まれています

両方が installで、このようになります Cakefileを持って
"dependencies": { 
    "coffee-script": "~1.2.0", 
    "repo-a": "git+ssh://[email protected]:myrepo.git" 
}, 
"scripts": { 
    "install": "./node_modules/coffee-script/bin/cake install" 
} 

をタスクはnpm installフック:

{print} = require "util" 
{spawn} = require "child_process" 

coffee = "./node_modules/coffee-script/bin/coffee" 

echo = (child) -> 
    child.stdout.on "data", (data) -> print data.toString() 
    child.stderr.on "data", (data) -> print data.toString() 
    child 

install = (cb) -> 
    console.log "Building..." 
    echo child = spawn coffee, ["-c", "-o", "lib", "src"] 
    child.on "exit", (status) -> cb?() if status is 0 

task "install", "Install, build, and test repo", install 
点の

npm installrepo-a用のための作品が、このメッセージを表示してrepo-bで失敗した:未完成___coffee-script.npmディレクトリがnode_modulesに存在

sh: ./node_modules/coffee-script/bin/cake: No such file or directory 

その時点で。

もちろん、app.js wrapperを使用するほうがはるかに簡単ですが、私はCoffeeScriptではなくJavaScriptを導入する必要があります。どのように私はこれを動作させることができるか誰に教えてもらえますか?

+0

何が価値があるため、私が頼りにする場合、このアプローチは動作しますグローバルな 'cake'バイナリです。ローカルにインストールされた' cake'を指定しているので失敗します。 –

答えて

9

2つのもの。

  1. あなたはNPMコマンドからケーキを実行している場合、あなただけのscripts.installフィールドとしてcake installcake buildを指定することができます。これは、 coffeeスクリプトがローカルにインストールされ、そのビンが適切に(ウィンドウ上のシムで)リンクされた後、を実行し、システムパスの中ではなくローカルにインストールされたcakeが使用されるようにPATH環境で実行されます。あなたはNPMコマンドからこれを実行しているないだが、あなたはそれにもかかわらず、あなたはおそらく、むしろ./node_modules/.bin/cake./node_modules/.bin/coffeeを打つべきである、コーヒー・スクリプトはすでに(それがどのように見える)NPM経由でローカルにインストールされていることを期待している場合
  2. パッケージ内部へ潜入するよりも。

あなたはNPMとコーヒーのスクリプトをインストールし、代わりにいくつかのgitのサブモジュールか何かを使用して、そしてあなた自身にしているされていない場合:)

+1

多くのありがとう、isaac。私はnpmのスコープがbinに拡張されたことを認識していませんでした。それはすばらしいニュースです。 「npm the repo」とは対照的に)「ツールのnpm」についてもっと知るほど、私はそれをもっと愛しています。それはソフトウェアの大きな部分です。 –

+1

'node_modules/.bin /'を 'PATH'(1.)に追加するのは、node_moduleのバイナリを普通のものとして使うことができるので本当にうまくいきます。この素晴らしいトリックを共有してくれてありがとう! – abernier

4

JSをローカルにビルドし、コンパイル済みのパッケージをtar.gzというファイルとしてS3に保存することをお勧めします。ローカル開発の場合はnpm link、実稼働環境ではアーカイブURLを指定します。あなたの依存関係をバージョンアップしたくない場合は、同じURLを何度も何度も更新しておけばよいのです。

https://github.com/isaacs/npm/issues/1727(バージョン番号としてgit/http urlsを使用するアプリケーションでdepsを更新するたびに、node_modulesフォルダを消去する必要があります)このnpmバグに注意してください。

--fg

+0

素晴らしい、ポインタのおかげで、フェリックス。私は今のところ[@ jashkenasの解決策](http://twitter.com/jashkenas/status/149516518802198528)に行き、提供されたモジュールからのコマンドなしでコンパイルすることになると思います。 –

関連する問題