2016-06-02 25 views
2

私はノードjsを初めて使用しています。私はnpmモジュールを構築しようとしていて、/node_modules/.binフォルダにあるcmdファイルとパッケージの名前をローカルに混同しています。ノードjsのnode_modules/.bin/package.cmdファイル

複数のパッケージを依存関係としてインストールし、cmdファイルが異なることが判明しました。

はjade.cmd

@IF EXIST "%~dp0\node.exe" (
    "%~dp0\node.exe" "%~dp0\..\jade\bin\jade" %* 
) ELSE (
    @SETLOCAL 
    @SET PATHEXT=%PATHEXT:;.JS;=;% 
    node "%~dp0\..\jade\bin\jade" %* 
) 

モカ-casperjs.cmd

@IF EXIST "%~dp0\/bin/sh.exe" (
    "%~dp0\/bin/sh.exe" "%~dp0\..\mocha-casperjs\bin\mocha-casperjs" %* 
) ELSE (
    @SETLOCAL 
    @SET PATHEXT=%PATHEXT:;.JS;=;% 
    /bin/sh "%~dp0\..\mocha-casperjs\bin\mocha-casperjs" %* 
) 

私の質問です、それはNPMは2つの異なるパッケージのための2つの異なるファイルを作成し、なぜNPMによって、自動生成された場合。それはユーザーが作成してNPMに伝えるものですか?

答えて

1

パッケージに付属の実行可能ファイルに./node_modules/.binディレクトリ(ローカルインストールの場合)またはグローバル(モジュールがグローバルにインストールされている場合)からアクセスできるようにすることができます。 binフィールドをpackage.jsonに置き、スクリプトへの相対パスを指定する必要があります。例えば、玉package.jsonは、次のコードを含む:ヒスイのパッケージをインストールするとき

"bin": { 
    "jade": "./bin/jade.js" 
} 

、NPMは、コンテンツが現在のOSに依存し、neccessary場合、ラッパー・スクリプト(jade.cmd)を生成することによって、このスクリプト(./bin/jade.js)がアクセスできるように、シェル、あなたがアクセス可能にしたいスクリプトの種類。 Jadeは.jsスクリプトを使用し、npmはノードを起動し、スクリプト名を引数として渡すOSに対してjade.cmdを生成します。しかし、mocha-casperjsはシェルスクリプトを使用するため、生成されたmocha-casperjs.cmdの内容が異なります。ノードの代わりにsh.exeが起動します。

あなたがここにpackage.jsonbin分野読むことができます:https://docs.npmjs.com/files/package.json#bin

+0

bin in package.jsonは、パッケージ実行ファイルがどこにあるかを示します。しかし、パッケージをインストールするときは、npmをnode_modules/jadeにインストールしてください(jadeは単なる例です)。node_modules/jade/bin/jadeを指すnode_modules/.bin/jade.cmdにcmdファイルを追加します。 – prabhat

+0

@prabhat、はい、あなたは正しいです。私は、node_modules/.binディレクトリにcmdファイルnpm場所の生成について書きました。このcmdファイルの内容を手動で変更することはできません。自動生成されます。それはあなたの質問に答えるか、私はあなたを理解できませんでしたか? – Victor

+0

npmがそれを生成した場合、なぜ2つのパッケージで異なるのですか、私の質問です。私はそれについてGoogle上で何かを見つけることができないので、私はここで尋ねた。 – prabhat

1

TLを、DR

Windowsでは、npmはどんなシェル/インタプリタに基づくラッパーバッチファイルが(*.cmd)に指定されて作成されますスクリプトファイルのシバンライン


それが始まる場合あなたが見ていることは、Windows用UnixのshebangメカニズムのNPMのエミュレーション、実行可能なプレーンテキストファイル(スクリプト)の非常に最初の行であります魔法の文字#!は、実行のためにスクリプトを渡すインタープリタ/シェルをOSに指示します(詳細は、this answerを参照してください)。 Windowsがシェバングラインをサポートしていませんので

は、npmはそれが明示的に指定されているものは何でも実行可能で、「バイナリ」ファイル(package.jsonbinキーで指定されたスクリプトファイル)を呼び出し、ラッパー*.cmd(バッチ)ファイルを作成しますスクリプトファイルのシバン行に表示されます。

つまり、npmは、スクリプトのshebang行を解析して、呼び出すシェル/インタープリタを決定し、それに応じてラッパーバッチスクリプトを作成します。

我々はjadeパッケージ内./bin/jade.jsで覗いた場合、我々はjade.cmdラッパーファイルがnode.exeを起動する理由ですシェバングライン、として#!/usr/bin/env nodeを参照してください。 Node.jsのエンジンによってを実行しなければならないのJavaScriptで書かれたスクリプト
これは典型的なケースです。

しかし、他のシェル/インタプリタがあまりにを指定しますが、与えられたシェル/インタプリタはまた、Windowsで提供されていますので、もしだけ理にかなってやってすることができます。 nodeのために、それは、mocha-casper.cmdショーの内容として、それはUnixのデフォルトのシェル/bin/sh行(shebang行#!/bin/shが含まれていmocha-casper.jsパッケージから./bin/mocha-casperjsファイル)にも意味がありません、与えられたが、されています。 mocha-casperjs

メーカーは(もバッチファイル)mocha-casperjs.batとしてcmd.exeため再実装により、独自のWindowsとの統合をロールバックするUNIXのシェルスクリプトを選択している - しかし、npmはこれを認識しませんがあるため、このバッチファイルをPATH(グローバル)に配置されていないか、名前でしか検出できません(プロジェクトコンテキストでCLIを呼び出すとき)。

より一般的には、また、Windows上で動作するスクリプトの、それは絶対、POSIX形式のパスでシェバングラインを使用しても意味がありません - ターゲットシェル/インタプリタがによって指定されている場合 EXCEPT indirect/usr/bin/env経由の呼び出しで、npmに送信され、PATHで検索する必要があります(詳細は、this answerの詳細を参照してください)。
(さらに、ラッパーバッチファイルは自身のディレクトリにありますが、package.jsonのエントリに明示的に追加したとしても、npmはそこにコピーされません。 binキー)

余談として:。npmの最近のバージョンも Windows上でUbuntuの上で、特にCygwinの、そしてバッシュ、Unix環境の拡張レスラッパースクリプトを作成します。


のCLIのため、(「バイナリ」)、独自のパッケージを作成 - あなたは、あまりにも Windows上仕事にNPMパッケージの一部である - コマンドラインユーティリティのように振る舞う直接実行可能なスクリプトを

  • はスクリプトにシェバング行を追加します - あなただけのこれまでのWindows上でそれらを実行するつもり場合でも:必要があります。

  • シバンラインを#!/usr/bin/env <interpreter-executable-filename-without-extension>と定義します。スクリプトはJavaScriptで書かれており、nodeで実行する必要がある場合 - - 一般的に使用:あなたのpackage.jsonファイルのbinキーで
    #!/usr/bin/env node

  • は、スクリプトのキー拡張子なしを定義します。の場合、.cmdがラッパーバッチファイルの作成時にキー名に直接追加されるため(Unixでは、キーの名前にシンボリックリンクが作成されます)、例えば: "bin": { "foo": "./bin/fooj.js" }

  • 警告:スクリプトは拡張子.jsを持っていますが、何のシェバングラインをありませんpackage.jsonbinキーで指される場合は、ラッパースクリプトはによってれる、直接.jsファイルを起動しますデフォルトでは(具体的には、JScript、そのJavaScriptエンジン)ではNode.jsではなく、意図したとおりに動作しません。 - 表示される症状についてはthis questionを参照してください。