如何用gitlab ci发布一个私有的npm包?

0g0grzrc  于 2022-11-30  发布在  Git
关注(0)|答案(3)|浏览(299)

我想用Gitlab CI发布一个私有的npm包。
我已经为我的npm用户创建了一个auth令牌,并在我的Gitlab CI设置中将其设置为变量NPM_TOKEN
然后,该作业将创建一个包含注册表和身份验证令牌的.npmrc文件。

- npm run build && npm run build:es6
- echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}'>.npmrc
- npm publish

作业失败,并显示以下消息:

npm ERR! code ENEEDAUTH
npm ERR! need auth auth required for publishing
npm ERR! need auth You need to authorize this machine using `npm adduser`

是否可以仅使用身份验证令牌进行发布?

wb1gzix0

wb1gzix01#

正如@Amityo所说,与其手动编辑npmrc文件,

npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}

是正确的方法,因为否则您可能会编辑错误的npmrc文件。
如果仍然出现身份验证错误,并且确信令牌是正确的,请检查注册表URL。

npm publish --verbose

其输出将包括如下行

npm verb getPublishConfig { registry: 'https://.......' }
npm verb mapToRegistry no registry URL found in name for scope @boxine
npm verb publish registryBase https://.......

如果要发布到npmjs.org,URL(上面的.......)应为https://registry.npmjs.org/
如果这个注册表URL不适合,请在您的npmrc文件中查找其他的。还要确保您没有覆盖package.json文件中的注册表!您可以在该文件中搜索**publishConfig**。

0yg35tkg

0yg35tkg2#

稍微详细说明一下**@phihag的答案,正斜杠非常**重要。
一开始我一直得到404没有找到

$ npm publish
...
...
npm ERR! code E404
npm ERR! 404 Not Found - PUT https://gitlab.company.com/api/v4/packages/npm/%2fmypackage - 404 Not Found
npm ERR! 404 
npm ERR! 404  '@scope/mypackage@0.1.0' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404 
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.

我使用的是2FA,所以正如gitlab文档所述,我需要使用一个设置为api的个人访问令牌来进行身份验证。
某些功能(例如出版封装)只能在项目层级端点上使用。
因此,在控制台中,我尝试在项目级别发布和验证

$ npm config set @scope:registry https://gitlab.company.com/api/v4/projects/123/packages/npm
$ npm config set //gitlab.company.com/api/v4/projects/123/packages/npm:_authToken 'MyGeneratedAccessToken'

这消除了我的第一个问题404没有找到,但现在我不能验证。几个小时。

$ npm publish --verbose
npm verb cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'publish', '--verbose' ]
npm info using npm@7.11.2
npm info using node@v15.11.0
...
...
npm verb publish [ '.' ]
npm notice
npm notice 📦  @scope/mypackage@0.1.0
npm notice === Tarball Contents === 
npm notice 214B  README.md   
npm notice 1.1kB package.json
npm notice === Tarball Details === 
npm notice name:          @scope/mypackage                            
npm notice version:       0.1.0                                   
npm notice filename:      @scope/mypackage-0.1.0.tgz                  
npm notice package size:  764 B                                   
npm notice unpacked size: 1.3 kB                                  
npm notice shasum:        c22a42756de43e282da01f33c7d5da4940c7d1d7
npm notice integrity:     sha512-l/P2cr52Lle7h[...]isu3rDME3lYuQ==
npm notice total files:   2                                       
npm notice
npm verb stack Error: This command requires you to be logged in.
npm verb stack     at Publish.publish (/usr/local/lib/node_modules/npm/lib/publish.js:104:29)
npm verb cwd /home/user/Workspace/mypackage
npm verb Linux 5.8.0-43-generic
npm verb argv "/usr/local/bin/node" "/usr/local/bin/npm" "publish" "--verbose"
npm verb node v15.11.0
npm verb npm  v7.11.2
npm ERR! code ENEEDAUTH
npm ERR! need auth This command requires you to be logged in.
npm ERR! need auth You need to authorize this machine using `npm adduser`
npm verb exit 1
npm timing npm Completed in 352ms
npm verb code 1

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user/.npm/_logs/2021-05-12T11_23_19_273Z-debug.log

正如您所看到的,npm publish --verbose在告诉我要发布到的URL方面没有帮助。再次检查文档,发现我在'packages/npm'后面缺少了尾随的斜杠。
通过后面的斜杠,我可以将该项目发布到gitlabnpm包库

$ npm config set @scope:registry https://gitlab.company.com/api/v4/projects/123/packages/npm/
$ npm config set //gitlab.company.com/api/v4/projects/123/packages/npm/:_authToken 'MyGeneratedAccessToken'

对于我使用的所有软件包

$ npm config set @scope:registry https://gitlab.company.com/api/v4/packages/npm/
$ npm config set //gitlab.company.com/api/v4/packages/npm/:_authToken 'MyGeneratedAccessToken'
qc6wkl3g

qc6wkl3g3#

我在npm publish上也遇到了同样的问题。我试过yarn publish,它也失败了。
我跑的时候就成功了:

yarn publish --non-interactive

此外,我遇到了一个与.husky相关的问题(* 无法安装husky*),在yarn publish之前运行npm的以下命令解决了该问题:

npm set-script prepare ''

相关问题