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

如何在NX monorepo中指定dist文件夹作为npm包发布源?

解决NX中nx-release-publish发布源代码而非dist构建产物的问题

你当前的问题是nx-release-publish调用项目的publish target时,发布的是项目源码而非dist/utils下的构建产物,核心原因是你的publish命令默认在项目根目录执行,没有指向构建产物目录。以下是几种可行的解决方案:

方案1:修改publish命令,切换到dist目录执行发布

直接修改project.json中的publish target,在执行发布脚本前切换到dist/utils目录:

{
  "name": "@my-lib/utils",
  "$schema": "../node_modules/nx/schemas/project-schema.json",
  "sourceRoot": "utils/src",
  "projectType": "library",
  "targets": {
    "build": {
      "executor": "@nx/vite:build",
      "outputs": ["{options.outputPath}"],
      "options": {
        "outputPath": "dist/utils",
        "generatePackageJson": true
      }
    },
    "publish": {
      "command": "cd dist/utils && node ../../tools/scripts/publish.mjs @my-lib/utils {args.ver} {args.tag}",
      "dependsOn": ["build"]
    },
    "lint": {
      "executor": "@nx/eslint:lint",
      "outputs": ["{options.outputFile}"]
    }
  },
  "tags": []
}

这样脚本会在构建产物目录下执行,发布的就是dist/utils里的内容。

方案2:调整publish.mjs脚本,指定发布目录

如果不想修改project.json的命令,可以在tools/scripts/publish.mjs中,将npm发布的目标路径改为dist下的对应目录。比如在脚本里执行npm publish时,先切换到构建产物目录:

// 示例publish.mjs关键代码调整
const packageName = process.argv[2];
const packageDir = `dist/${packageName.split('/')[1]}`; // 从@my-lib/utils提取utils,对应dist/utils
process.chdir(packageDir); // 切换到构建产物目录
// 后续执行npm publish相关逻辑

方案3:改用NX官方的@nx/js:npm-publish执行器

替换自定义脚本为NX官方的发布执行器,更贴合NX生态,配置如下:

{
  "name": "@my-lib/utils",
  "$schema": "../node_modules/nx/schemas/project-schema.json",
  "sourceRoot": "utils/src",
  "projectType": "library",
  "targets": {
    "build": {
      "executor": "@nx/vite:build",
      "outputs": ["{options.outputPath}"],
      "options": {
        "outputPath": "dist/utils",
        "generatePackageJson": true
      }
    },
    "publish": {
      "executor": "@nx/js:npm-publish",
      "options": {
        "packageRoot": "dist/utils",
        "tag": "latest"
      },
      "dependsOn": ["build"]
    },
    "lint": {
      "executor": "@nx/eslint:lint",
      "outputs": ["{options.outputFile}"]
    }
  },
  "tags": []
}

这个执行器会自动从packageRoot指定的目录读取构建产物并发布,无需额外处理路径。

以上三种方案任选其一即可解决问题,因为nx-release-publish本质是调用你项目中配置的publish target,只要确保该target操作的是dist/utils目录的内容,就能发布正确的构建产物。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:22:34