npm:从项目文件夹内的任何位置运行package.json中的脚本

时间:2012-12-13 13:06:33

标签: node.js path npm

我正在使用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

4 个答案:

答案 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)

INIT_CWD

我们可以通过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包让生活更轻松。