在npm工作区子包执行npm config list报ENOWORKSPACES错误的解决咨询
解决npm工作区子包目录执行
npm config list报ENOWORKSPACES错误(Azure Pipelines场景) 问题背景
项目结构如下:
workspace_test │ package.json │ └───dist └───libs └───pkg package.json
根目录package.json配置了npm工作区:
{ "name": "project", "version": "1.0.0", "description": "", "main": "index.js", "workspaces": [ "dist/libs/*" ] }
当在dist/libs/pkg目录执行npm config list时,触发以下错误:
npm ERR! code ENOWORKSPACES npm ERR! This command does not support workspaces.
在Azure Pipelines场景中,Npm@1任务会自动在子包产物目录执行npm config list,且无法直接为该命令添加--no-workspaces参数。当前使用版本:
- node: v18.16.1
- npm: 9.7.2
可行解决办法
方法1:子包目录添加.npmrc配置
在dist/libs/pkg目录创建.npmrc文件,写入以下内容:
workspaces=false
npm会优先读取当前目录的.npmrc配置,自动禁用工作区模式,避免触发错误。如果子包是编译生成的,可在编译脚本中自动生成该文件。
方法2:通过环境变量全局禁用工作区
在Npm@1任务前添加设置环境变量的步骤,让npm执行时默认禁用工作区:
- ${{ each package in parameters.packages }}: - task: Bash@3 # Windows环境替换为Cmd@2 displayName: 'Disable npm workspaces for ${{ package.packageName }}' inputs: targetType: 'inline' script: 'echo "##vso[task.setvariable variable=npm_config_workspaces;]false"' workingDir: ${{ package.pathToDist }} - task: Npm@1 displayName: 'Publish ${{ package.packageName }} Package' continueOnError: true inputs: command: publish workingDir: ${{ package.pathToDist }} publishRegistry: useFeed publishFeed: ${{ parameters.npmFeedId }}
npm会识别npm_config_前缀的环境变量作为配置项,此设置等同于全局启用--no-workspaces参数。
方法3:修改子包package.json排除工作区
在dist/libs/pkg/package.json中添加空工作区配置,让npm不将该目录识别为工作区的一部分:
{ "name": "pkg", "version": "1.0.0", "workspaces": [] }
若子包为编译产物,可在编译流程中自动注入该配置。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

