Bin脚本在Windows上工作正常但在Linux上却奇怪地失败

时间:2015-08-03 00:57:16

标签: node.js

我正在尝试为Node编写一个小型CLI帮助程序,它允许我跨平台设置环境变量。例如,如果您有如下的NPM脚本:

"something": "MY_VAR=thing node index.js"
Windows上将取消设置

MY_VAR。我的解决方案是编写一个小型库,它提供一个新命令,该命令将运行带有一组给定环境变量的子命令(例如readme)。我在Windows中进行了测试和开发,假设这将是更难以定位的环境,并使其完美运行。但是,当我试图在Linux上测试它时,我得到一个奇怪的错误。我用这个package.json创建了一个新项目:

{
  "scripts": {
    "grunt": "grunt --help",
    "envade": "envade"
  },
  "dependencies": {
    "envade": "^1.0.1",
    "grunt-cli": "^0.1.13"
  }
}

然后:

$ npm run envade

> @ envade /code
> envade

: No such file or directory

npm ERR! Linux 3.13.0-57-generic
npm ERR! argv "node" "/usr/local/bin/npm" "run" "envade"
npm ERR! node v0.12.6
npm ERR! npm  v2.11.3
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! @ envade: `envade`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the @ envade script 'envade'.
npm ERR! This is most likely a problem with the  package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     envade
npm ERR! You can get their info via:
npm ERR!     npm owner ls 
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /code/npm-debug.log

这里可能出现什么问题? npm run grunt工作得非常好,据我所知,我遵循了相同的应用程序结构。我试图将index.js中的envade重命名为index(没有文件扩展名),但似乎也出现了相同的错误。我还尝试在安装后用index.js替换console.log('hi');的内容,以排除脚本本身的错误。

我最初跟着this guide创建了Node脚本。我发现因为没有文件名而很难谷歌这个错误!

1 个答案:

答案 0 :(得分:1)

问题是dos / windows换行符(crlf)。所以,'节点^ M'被解释为envade二进制文件中此行中的文件名:

#!/usr/bin/env node^M

当然找不到文件......

P.S。您可以使用以下命令解决问题:

sed -i 's/\r//' envade