我正在使用package.json文件中的scripts
部分来存储我必须定期运行的一些命令。
"scripts": {
"test": "./test/phantomjs ./test/js/run_jasmine_test.coffee ./test/index.html",
"rjs": "r.js -o ./js/app.build.js",
"less": "lessc -x ./css/app.less > ./css/app.css"
}
在每个命令中,我在路径的开头都有./
- 这就是我只能从项目的根目录中调用npm run-script rjs
的原因。
有没有办法在package.json中引用项目的根目录,以便我可以运行,例如我项目中的任何地方npm test
?
答案 0 :(得分:2)
我认为这取决于您组织项目的方式。
我创建了一个示例项目来演示。这是我的示例项目目录树:
.
├── dir1
│ └── dir2
├── package.json
├── src
│ └── index.js
└── test
└── test.js
注意: ./dir1/dir2
只是两个用于演示的空目录。
我的package.json
文件如下所示:
{
"name": "sample",
"version": "1.0.0",
"description": "sample",
"main": "index.js",
"scripts": {
"test": "node test/test.js",
"start": "node src/index.js"
},
"author": "yaniv",
"license": "ISC"
}
专注于脚本部分,这两行是简单的,不考虑我的位置。
如果我将目录更改为/dir1/dir2
并执行npm test
并且我在test
属性上编写的脚本正确执行而不使用./
(定义当前目录) ...)
底线 - 我想如果您重新组织项目并删除./
,则可以完成您的工作。
答案 1 :(得分:1)
我们可以通过npm为我们设置的环境变量INIT_CWD
引用项目的根目录!
来自doc:
脚本从模块的根目录运行,而不管调用npm run时当前的工作目录是什么。如果希望脚本根据所在的子目录使用不同的行为,则可以使用 INIT_CWD 环境变量,该变量保存您运行npm run时的完整路径。
示例:
"tas:adminApp:build": "cd src/KidoService/AdminApp && npm run build && cd $INIT_CWD && gulp build_copyAdminApp",
仅仅是因为我爱思考太多!
如果我们没有为我们设置这样的变量怎么办!
我们可以从头开始执行env变量设置命令! export ROOT_DIR=$PDW
!
然后当我们需要它时!我们可以使用它!
以上示例将变为
"tas:adminApp:build": "export ROOT_DIR=$PDW && cd src/KidoService/AdminApp && npm run build && cd $ROOT_DIR && gulp build_copyAdminApp",
您可以看到这是一个不错的技术!我们可以使用它来引用一些我们想返回的目录!
对于Windows,我们使用set VAR=VALUE
答案 2 :(得分:0)
考虑创建一个运行的shell文件?
例如创建一个.sh文件使其可执行(chmod 777 file.sh)
然后cd到你的nodejs项目root,运行npm命令,然后回到你刚刚离开的目录?
将脚本添加到您的环境将使其可以从任何地方执行...
或者硬编码完整路径可以吗? (所以而不是使用./ - put / home / user / username / yourproject / phantomjs)
答案 3 :(得分:0)
我发现更好的选择是创建一个js脚本而不是shell脚本。从我的经验来看,似乎更容易与npm打交道。然后,您可以在运行命令之前检查您所处的环境。我们有人同时使用windows,mac和ubuntu并检查环境或使用fs包让生活更轻松。