Yarn 3工作区中,如何获取脚本调用方的包路径?
解决Yarn 3工作区调用脚本时获取调用者路径的问题
有两种可行的方法实现你的需求:
方法一:直接使用Yarn提供的环境变量
Yarn 3在执行脚本时会保留调用者的初始工作目录,这个路径存在INIT_CWD环境变量中。直接修改myscripts包的package.json脚本即可:
{ "name": "myscripts", "scripts": { "migrate": "./migrate up -m $INIT_CWD/migrations" } }
当你在foo包目录下执行yarn run migrate时,$INIT_CWD会自动替换为foo包的绝对路径,脚本就会指向foo/migrations目录。
注意:这种写法是类Unix系统(Linux/macOS)的语法,Windows系统需要改用%INIT_CWD%,如果需要跨平台兼容,建议用下面的方法。
方法二:用Node脚本封装(跨平台)
写一个简单的Node脚本作为中转,利用process.cwd()获取调用者的工作目录(也就是foo包的路径),再执行原迁移命令:
- 在
myscripts包根目录创建migrate.js文件:
const { spawnSync } = require('child_process'); const path = require('path'); // 获取调用者的目录(执行yarn命令时的目录) const callerDir = process.cwd(); // 拼接出migrations目录的绝对路径 const migrationsDir = path.join(callerDir, 'migrations'); // 执行原迁移命令,继承标准输入输出让日志正常显示 spawnSync('./migrate', ['up', '-m', migrationsDir], { stdio: 'inherit', shell: true });
- 修改
myscripts包的package.json,让脚本指向这个Node文件:
{ "name": "myscripts", "scripts": { "migrate": "node migrate.js" } }
这种方法可以在Windows、Linux、macOS上正常工作,不需要担心环境变量语法差异。
内容的提问来源于stack exchange,提问作者Tim Fairbrother
相关产品推荐
相关产品推荐

