いくつかのタスクを実行するために実行可能なノードスクリプトを作成しました。 Windowsでは、ノードスクリプトは正常に機能します。しかし、Mac OS X(Yosemite)では機能しません。
ノードスクリプトがWindowsで公開されました。
私のノードスクリプトはnpmコマンドでインストールされます:
npm install -g task-app
私のノードスクリプトには次の最初の行があります。
#! /usr/bin/env node
私は自分の問題を解決するためにいくつかの解決策を試しましたが、まだ行き詰まっています。
これが私が使用したこれらのソリューションです:
提案する他のソリューションはありますか?
編集:
私のスクリプトの始まり:
#! /usr/bin/env node
var grunt = require('grunt');
//Get parameters from command line
var args = process.argv.splice(2);
[...]
結局、私は自分の問題の解決策を見つけました。
私のノードスクリプトファイルはWindowsで作成されているため、ファイルはDOS形式です(行末はDOS形式であると思います)。そこで、ファイルをUNIX形式に変換できるモジュールを使用しました。
brew install dos2unix
Sudo dos2unix /usr/local/lib/node_modules/task-app/src/task-app.js
Vimを使用することもできます。
vim script
:se ff=unix
:wq
これにより、DOSスタイルの改行がUnixスタイルの改行に変換されます。
スクリプトの改行に問題があります。 #!/usr/bin/env node
(windows/dosスタイル)ではなく、\n
の後に\r\n
(UNIXスタイル)が続くようにしてください。これを修正するには、tr
コマンドを使用してファイルから\r
を削除します。
cat your_script.js | tr -d '\r' > fixed_script.js
PauloDevが上で述べたように、これはMac/Windowsの行末の問題です。詳しく説明すると、nvm
を使用している場合は、最初にスクリプトを見つける必要があります(私の場合はexpress-mvc-generator
を使用しています)。
# install dos2unix
brew install dos2unix
# output the full path of your node version
which node
>> /Users/<username>/.nvm/versions/node/v8.0.0/bin/node
# confirm the file path
cat /Users/<username>/.nvm/versions/node/v8.0.0/lib/node_modules/express-mvc-generator/bin/express
# convert the line endings
Sudo dos2unix /Users/<username>/.nvm/versions/node/v8.0.0/lib/node_modules/express-mvc-generator/bin/express
# then run your script
MS-DOSによって挿入されたキャリッジリターンは、スクリプトインタープリター名の一部として解釈されます。これは、ちなみにUn * xシステムの正しい動作です。したがって、システムはファイルを検索します/usr/bin/node\r
の代わりに /usr/bin/node
。他の人が指摘したように、npm
は、少し怪しい動作である改行文字を削除することで問題を「修正」しました。
DOS行で終わるShebang行の実行可能ファイルは破損しており、ユーザー、npm
、またはyarn
ではなく作成者が修正する必要があります。この記事の執筆時点では、たとえWindowsシステムで開発している場合でも、DOSの行末を使用する理由はほとんどありません。ただし、一般に配布する前に、少なくとも作成したファイルを修正する必要があります。行末を正しく処理するようにgitを構成する方法については、 https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings を参照してください。
Npm@^5.4.0以降、これは問題にはなりません。 npmが正しい行末に自動変換されるようになりました。 https://github.com/npm/npm/issues/12371 を参照してください。
ただし、これは依然として糸の問題です https://github.com/yarnpkg/yarn/issues/548 。
私のようにnpmの代わりにyarnを使用しているときにこのエラーが発生したためにこのページにアクセスした場合は、yarnの代わりにnpmを使用することを検討してください。とにかく、(おそらく)npmは最近、ほとんどの糸の最高の機能を備えています。