web-dev-qa-db-ja.com

npm package.jsonbinはWindowsでは機能しません

Package.json binプロパティを介してCLIツールを起動しようとしています。

私は次のものを持っています:

...
"name": "mycli",
"bin": "./bin/mycli",
...

パッケージパスでcmdを開き、「mycli」と入力すると、コマンドが認識されないというメッセージが表示されます。

Npmコマンドを実行する必要がありますか?またはscriptsプロパティを使用しますか? binプロパティに誤ってアクセスしようとしていますか?

15
funerr

次のように、cliプロパティでbinツールの名前を指定してみてください。

"bin": {
  "mycli": "./bin/mycli" // or "/bin/mycli.js" if it's a .js file
}

次に、プロジェクトフォルダー内からnpm linkを実行して、現在のフォルダーへのグローバルシンボリックリンクを作成します。

モジュールをグローバルにインストールするようにユーザーに警告するために、"preferGlobal": "true"ファイルのbinプロパティの直前にpackage.jsonプロパティを追加することを忘れないでください。

20

アプリをリンクさせようとすると、Windowsで問題が発生し続け、パス上で実行される生成されたスクリプトが、デフォルトのWindows実行可能ファイルを使用して*.jsファイルを実行しようとしました(何がわかりません)。それはそうなるでしょう)。理由はわかりません。 JavaScriptファイルだからかもしれないと思います。ただし、生成されたスクリプトをインストールした他のモジュールと比較したところ、package.jsonによって参照されるbinファイルを、で実行されるかのように動作させることがわかりました。 *nixマシン、npmは自動的にノードへの呼び出しを追加しようとしますが、.

例えば:

私のpackage.jsonが次のようになっている場合:

myapp/package.json

"name": "myapp",
"bin": {
    "myapp": "./bin/myapp"
}

私の参照するbinファイルは次のようになります。

myapp/bin/myapp

#!/usr/bin/env node
require("../server.js");

%APPDATA%\npmに表示される2つの生成された実行可能ファイルは、myappディレクトリ(ルートにnpm linkが含まれる)内からコマンドpackage.jsonを実行すると次のように表示されます。

myapp

#!/bin/sh
basedir=`dirname "$0"`

case `uname` in
    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac

if [ -x "$basedir/node" ]; then
  "$basedir/node"  "$basedir/node_modules/myapp/bin/myapp" "$@"
  ret=$?
else 
  node  "$basedir/node_modules/myapp/bin/myapp" "$@"
  ret=$?
fi
exit $ret

myapp.cmd

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\node_modules\myapp\bin\myapp" %*
) ELSE (
  node  "%~dp0\node_modules\myapp\bin\myapp" %*
)

上記の2つのファイルを明示的に作成する必要はなく、ファイルをpackage.jsonbinファイルとして実行する必要があることに注意してください。 npmがファイルの作成を行いました。


行末

この方法を使用しているときに遭遇したもう1つの注意点は、行末が正しいことを絶対に確認することです。 * nixマシンにインストールするたびに、行末が正しくないため、ビンに「:そのようなファイルまたはディレクトリはありません」というエラーが表示されていることに気付きました。おかげで テキストファイルで行末を表示 たとえば、表示されている行末を印刷する方法。

たとえば、cat -e PATH_TO_BINを実行して、次のようなものを取得した場合:

#!/usr/bin/env node^M$
^M$
require("../index.js");^M$

間違った行末を使用しています。あなたがこのようなものを手に入れたら:

#!/usr/bin/env node$
$
require("../index.js");$

それらは正しい行末でなければなりません。

16
zero298

Rodrigo Medeirosからの回答は私には有効ですが、.jsファイルにShebang行が多すぎる場合に限ります。

そこで別の問題がありました。 node.jsをc:\ Program files\nodejsにインストールしましたが、これが私のShebang行でした。

#!c:/program files/nodejs/node

空白のため、これは機能しませんでした。これは正しいものでした:

#!c:/progra~1/nodejs/node
2
Gregorio

入れたら

#!/usr/bin/env node

スクリプトの最初の行で、npmは必要なラッパースクリプトを作成します。

1
AndreKR