Pau*_*Dev 17 command-line node.js osx-yosemite
我创建了我的节点脚本可执行文件来执行一些任务grunt.在Windows上,我的节点脚本工作正常.但是在Mac OS X(Yosemite)上,它不起作用.
我的节点脚本已在Windows上发布.
我的节点脚本是通过npm命令安装的:
npm install -g task-app
Run Code Online (Sandbox Code Playgroud)
我的节点脚本有第一行:
#! /usr/bin/env node
Run Code Online (Sandbox Code Playgroud)
我尝试了很多解决方案来解决我的问题,但我仍然陷入困境.
以下是我使用的这些解决方案:
你有其他解决方案吗?
编辑:
我脚本的开头:
#! /usr/bin/env node
var grunt = require('grunt');
//Get parameters from command line
var args = process.argv.splice(2);
[...]
Run Code Online (Sandbox Code Playgroud)
Pau*_*Dev 30
毕竟,我找到了解决问题的方法.
由于我的节点脚本文件已在Windows上创建,因此该文件为DOS格式(我认为是DOS格式的行结尾).所以,我使用了一个允许将文件转换为unix格式的模块:
brew install dos2unix
sudo dos2unix /usr/local/lib/node_modules/task-app/src/task-app.js
Run Code Online (Sandbox Code Playgroud)
Joh*_*hnQ 12
你也可以使用vim:
vim script
:se ff=unix
:wq
Run Code Online (Sandbox Code Playgroud)
这将确认DOS风格换行符的DOS风格.
脚本中的换行符存在问题.确保#!/usr/bin/env node后跟\n(unix样式)而不是\r\n(windows/dos样式).要解决此问题,请使用该tr命令\r从文件中删除:
cat your_script.js | tr -d '\r' > fixed_script.js
Run Code Online (Sandbox Code Playgroud)
从 npm@^5.4.0 开始,这应该不再是问题。npm 现在将自动转换为正确的行结尾。请参阅https://github.com/npm/npm/issues/12371。
然而,这仍然是纱线中的一个问题:https ://github.com/yarnpkg/yarn/issues/5480 。
如果您来到此页面是因为在使用yarn而不是npm时遇到此错误(就像我一样),那么您可能需要考虑使用npm而不是yarn。无论如何(可以说),npm 拥有目前yarn 的大部分最佳功能。
小智 5
原因:这通常是由于行结尾的差异,尤其是 LF 与 CRLF 的差异。Linux 和 macOS 等 Unix 系统默认使用 LF (换行符)作为换行符。另一方面,Windows 是特殊的,默认情况下使用 CR/LF 、回车符和换行符。参考:https://qvault.io/clean-code/line-breaks-vs-code-lf-vs-crlf/
解决方案:对于 mac 用户,将发生错误的文件中的 CRLF 更改为 LF。