我不仅可以从项目根目录运行NPM脚本,还可以从子文件夹运行NPM脚本。但是,由于它无法告诉我当前的工作路径($ PWD)。
我们假设有一个这样的命令:
"scripts": {
...
"pwd": "echo $PWD"
}
如果我在项目根目录的子文件夹中运行npm run pwd
(例如$PROJECT_ROOT/src/nested/dir
),而不是打印出我当前的路径$PROJECT_ROOT/src/nested/dir
,那么它总是会返回$PROJECT_ROOT
。有没有办法告诉NPM脚本使用我当前的工作目录而不是解析 package.json 所在的位置?
<子>
基本上我想将Yeoman生成器拉入现有项目并通过NPM脚本使用它,这样每个人都可以使用共享知识(例如npm run generator
)而不是学习任何特定的Yeoman(例如npm i yo -g; yo generator
)。由于生成器基于当前工作路径生成文件,而NPM脚本始终解析为项目根目录,因此我无法使用它打算使用的生成器。
子>
答案 0 :(得分:2)
如果您希望脚本根据您所在的子目录使用不同的行为,则可以使用
INIT_CWD
环境变量,该变量保存了运行npm run
时的完整路径。
来源:https://docs.npmjs.com/cli/run-script
像这样使用它:
"scripts": {
"start": "live-server $INIT_CWD/somedir --port=8080 --no-browser"
}
更新2019-11-19
$INIT_CWD
仅在类似* nix的平台上工作。 Windows将需要%INIT_CWD%
。令人失望的是,Node.js并没有为我们抽象这一点。解决方案:使用cross-env-shell live-server $INIT_CWD/somedir....
-> https://www.npmjs.com/package/cross-env
答案 1 :(得分:1)
一种已知的解决方案是通过ENV变量注入。
例如:
在命令行中声明变量:
cwd="$(pwd)" npm run pwd
在package.json中使用env变量:
"pwd": "cd $cwd && echo $PWD"
但是,始终传递cwd="$(pwd)"
作为前缀看起来更像是黑客,是否有更清洁/更好的解决方案?
答案 2 :(得分:0)
使用节点8+,您可以自动执行ENV变量注入。
1.--在$ HOME / .node_modules /(默认的节点搜索路径)中,使用
创建文件mystart
process.env.ORIGPWD = process.env.PWD
2.--然后在$ HOME / .bashrc中,告诉节点每次加载mystart
export NODE_OPTIONS="-r mystart"
3.--在脚本中使用$ORIGPWD
。该功能适用于npm
,yarn
和其他用户。