我创建一个节点的命令行界面。 这是全球范围内安装并使用bin文件来执行。
我计划有一个命令行窗口,在我的工作,然后只需运行命令,但是我一直无法确定当前工作目录中的文件的根目录下打开process.cwd()
的返回节点包的目录。 我最初认为,因为正在使用批处理文件作为一个包装(那是多么的bin文件可以在开头没有节点执行),那么它是不可能的,但咖啡脚本管理做执行的代码。 我接过一看咖啡脚本来源,但无法追踪(没有足够的经验)。
为了测试它为自己创建这个文件的package.json包:
{
"name": "test-package",
"version": "1.0.0",
"bin": {
"test-package": "./bin/test-package"
},
"main": "/lib/test"
}
在此斌测试包文件:
#!/usr/bin/env node
var path = require('path');
var fs = require('fs');
var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');
require(lib + '/test');
任何人都可以提供一些线索到此。
然后尝试,并获得的lib /测试中的命令行目录。
-
process.cwd()
如果它尚未被应用的内改变,以通过“process.chdir”返回,其中命令已经执行目录(不是节点包的目录)。 -
__filename
返回到文件中,这样放置绝对路径。 -
__dirname
返回目录的绝对路径__filename
。
如果你需要从你的模块目录中加载文件时,你需要使用相对路径。
require('../lib/test');
代替
var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');
require(lib + '/test');
它总是相对于文件中,这样的调用,不依赖于当前的工作目录。
当前工作目录
为了得到当前工作目录,你可以使用:
process.cwd()
但是,要知道,有些脚本,特别是大口喝,将改变当前的工作目录与process.chdir()
节点模块路径
您可以获取当前模块的路径:
原目录(其中已启动的命令)
如果你正在运行的命令行脚本,并希望从中运行脚本,无论哪个目录的脚本当前运行在原来的目录,你可以使用:
process.env.INIT_CWD
原来的目录,与NPM脚本工作时
它有时需要在当前目录运行脚本故宫,而不是项目的根。
此变量可用NPM包脚本,里面:
$INIT_CWD.
您必须运行一个最近的NPM的版本。 如果这个变量是不可用,确保NPM是最新的。
这将允许您访问您的package.json,如当前路径:
scripts: {
"customScript": "gulp customScript --path $INIT_CWD"
}
另外,如果你想只获得当前脚本的NodeJS的当前目录,你可以尝试一些简单的像这样。 请注意,这将不会在节点CLI本身的工作:
var fs = require('fs'),
path = require('path');
var dirString = path.dirname(fs.realpathSync(__filename));
// output example: "/Users/jb/workspace/abtest"
console.log('directory to start walking...', dirString);
path.resolve('.')
也是一个可靠和清洁的选择,因为我们几乎总是require('path')
它会给你从那里它被称为目录的绝对路径。