You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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包的路径),再执行原迁移命令:

  1. 在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
});
  1. 修改myscripts包的package.json,让脚本指向这个Node文件:
{
  "name": "myscripts",
  "scripts": {
    "migrate": "node migrate.js"
  }
}

这种方法可以在Windows、Linux、macOS上正常工作,不需要担心环境变量语法差异。

内容的提问来源于stack exchange,提问作者Tim Fairbrother

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:20:17