如何在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
相关产品推荐
相关产品推荐

