我正在尝试为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脚本。我发现因为没有文件名而很难谷歌这个错误!
答案 0 :(得分:1)
问题是dos / windows换行符(crlf)。所以,'节点^ M'被解释为envade二进制文件中此行中的文件名:
#!/usr/bin/env node^M
当然找不到文件......
P.S。您可以使用以下命令解决问题:
sed -i 's/\r//' envade