npm 私有全局范围:找不到命令
npm private global scoped : command not found
我使用 GitLab NPM Package Repository 发布了一个私有 NPM 包,需要限定范围。
这个包应该添加一个 sspm
全局可用的命令作为 CLI。
当我使用 npm install -g @{ORG}/{PACKAGE_NAME}
从存储库安装它时,它被正确地添加到 /usr/local/lib/node_modules/@{ORG}/{PACKAGE_NAME}
下并且文件看起来是正确的,但是当我 运行 以下命令之一时,找不到命令:
# zsh: command not found: sspm
sspm
@{ORG}/sspm
@{ORG}\/sspm
但是如果我使用项目路径而不是它的名称全局安装包,它就可以工作(即使当我使用它的名称安装它时,文件也会正确下载)
这是我到这里为止尝试过的所有内容
npm install -g @{ORG}/{PACKAGE_NAME}
sspm # command not found
npm uninstall -g @{ORG}/{PACKAGE_NAME}
npm install -g ./ # Installing the project from its project directory
sspm # WORKS
这是我的 package.json
文件:
{
"name": "@{ORG}/{PACKAGE_NAME}",
"version": "1.0.0",
"main": "src/index.js",
"publishConfig": {
"@{ORG}:registry": "https://gitlab.com/api/v4/projects/.../packages/npm/"
},
"bin": {
"sspm": "./bin/main.js"
},
"scripts": {...},
"repository": {
"url": "https://gitlab.com/..."
},
"bugs": {
"url": "https://gitlab.com/..."
},
"homepage": "https://gitlab.com/...,
"devDependencies": {...},
"dependencies": {...}
}
更新 (2021-04-20)
检查命令的 NPM 位置(由 运行ning npm bin -g
找到)结果表明没有为此包创建符号链接。我的 NPM 配置显示 bin-links
选项已正确设置为 true。
我还尝试使用相同的 package.json
语法在 npmjs.com 上发布示例 public 包,安装后我的命令在全球范围内可用。当我在 GitLab NPM 注册表上发布完全相同的包时,安装后找不到该命令。
作为解决方法,我尝试向我的 package.json
添加一个 scripts.postinstall
条目,这应该为每个缺失的 bin
条目创建缺失的符号链接。但是事实证明,脚本在安装后没有执行,而 NPM 文档说它应该
所以,除了责怪 GitLab NPM 注册表本身,我 运行 没有想法......
似乎将 GitLab NPM 注册表与 NPM v7+ 一起使用会阻止执行 postinstall
挂钩。只需降级 NPM 即可从 GitLab NPM 注册表进行全局安装以执行 postinstall
脚本,该脚本允许为每个 package.json.bin
条目创建符号链接。
为了解决这个问题,我们已经降级到 NPM 6.14.12
: npm install -g npm@6.14.12
我使用 GitLab NPM Package Repository 发布了一个私有 NPM 包,需要限定范围。
这个包应该添加一个 sspm
全局可用的命令作为 CLI。
当我使用 npm install -g @{ORG}/{PACKAGE_NAME}
从存储库安装它时,它被正确地添加到 /usr/local/lib/node_modules/@{ORG}/{PACKAGE_NAME}
下并且文件看起来是正确的,但是当我 运行 以下命令之一时,找不到命令:
# zsh: command not found: sspm
sspm
@{ORG}/sspm
@{ORG}\/sspm
但是如果我使用项目路径而不是它的名称全局安装包,它就可以工作(即使当我使用它的名称安装它时,文件也会正确下载)
这是我到这里为止尝试过的所有内容
npm install -g @{ORG}/{PACKAGE_NAME}
sspm # command not found
npm uninstall -g @{ORG}/{PACKAGE_NAME}
npm install -g ./ # Installing the project from its project directory
sspm # WORKS
这是我的 package.json
文件:
{
"name": "@{ORG}/{PACKAGE_NAME}",
"version": "1.0.0",
"main": "src/index.js",
"publishConfig": {
"@{ORG}:registry": "https://gitlab.com/api/v4/projects/.../packages/npm/"
},
"bin": {
"sspm": "./bin/main.js"
},
"scripts": {...},
"repository": {
"url": "https://gitlab.com/..."
},
"bugs": {
"url": "https://gitlab.com/..."
},
"homepage": "https://gitlab.com/...,
"devDependencies": {...},
"dependencies": {...}
}
更新 (2021-04-20)
检查命令的 NPM 位置(由 运行ning npm bin -g
找到)结果表明没有为此包创建符号链接。我的 NPM 配置显示 bin-links
选项已正确设置为 true。
我还尝试使用相同的 package.json
语法在 npmjs.com 上发布示例 public 包,安装后我的命令在全球范围内可用。当我在 GitLab NPM 注册表上发布完全相同的包时,安装后找不到该命令。
作为解决方法,我尝试向我的 package.json
添加一个 scripts.postinstall
条目,这应该为每个缺失的 bin
条目创建缺失的符号链接。但是事实证明,脚本在安装后没有执行,而 NPM 文档说它应该
所以,除了责怪 GitLab NPM 注册表本身,我 运行 没有想法......
似乎将 GitLab NPM 注册表与 NPM v7+ 一起使用会阻止执行 postinstall
挂钩。只需降级 NPM 即可从 GitLab NPM 注册表进行全局安装以执行 postinstall
脚本,该脚本允许为每个 package.json.bin
条目创建符号链接。
为了解决这个问题,我们已经降级到 NPM 6.14.12
: npm install -g npm@6.14.12