我不仅可以从项目根目录运行 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 脚本始终解析为项目根目录,因此我无法在打算使用生成器的地方使用生成器。
如果您希望脚本根据您所在的子目录使用不同的行为,您可以使用
环境变量,它保存您运行时所在的完整路径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
一种已知的解决方案是通过 ENV 变量注入。
例如:
在package.json中定义脚本:
"pwd": "cd $VAR && echo $PWD"
从任何子目录调用它:
VAR=$(pwd) npm run pwd
但是,这看起来真的很难看,有没有更干净/更好的解决方案?
使用节点 8+,您可以自动执行 ENV 变量注入。
1.- 在 $HOME/.node_modules/ (默认节点搜索路径)中创建一个文件
mystart
with
process.env.ORIGPWD = process.env.PWD
2.- 然后在 $HOME/.bashrc 中告诉节点每次加载
mystart
export NODE_OPTIONS="-r mystart"
3.- 在脚本中使用
$ORIGPWD
。这适用于
npm
、
yarn
和其他。