如何将私有项目发布到Sinopia(私有注册表的npm adduser失败)

cda*_*nea 20 package-managers node.js npm

好的,所以我终于设法使用Sinopia获得私人npm注册表.但我无法发表任何内容.

TL; DR:Sinopia不支持npm adduser,但有自己的用户管理.此外,npm需要在 通过npm adduser 发布npm之前创建的有效用户,该用户失败,因为内部Sinopia服务器在不支持的命令中抛出错误....

如何使用Sinopia作为具有适当用户和密码的私人注册表

  1. 在npmjs.org中创建一个全局用户,然后在Sinopia中使用相同的密码创建另一个用户?
  2. 或者有一种更简单的方法告诉npm只使用固定的用户/通行证.
  3. 或者甚至更好地提示我用户名和密码?
  4. 别的什么?

概要:

Sinopia不依赖于Couch.DB,并且会从主服务器中获取它尚未拥有的包(默认为全局npmjs.org).

Sinopia完美启动并配置为侦听所有接口.它为包裹提供了奇迹

npm install
Run Code Online (Sandbox Code Playgroud)

我甚至将〜/ .npmrc配置为始终指向内部注册表.

所有项目的package.json文件都设置为

  ....
  "publishConfig" : {
     "registry" : "http://internal-npm:4873"
  },
  ....
Run Code Online (Sandbox Code Playgroud)

我还设法通过在js-yaml的帮助下操作config.yaml来在sinopia中添加自定义用户

crypto.createHash('sha1').update('theBigPassword').digest('hex')
Run Code Online (Sandbox Code Playgroud)

现在我被困在了

npm --registry=http://internal-npm:4873 --ca=null publish
Run Code Online (Sandbox Code Playgroud)

经过漫长的等待,我得到:

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

npm ERR! System Linux 3.11.0-18-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "--registry=http://internal-npm:4873" "--ca=null" "publish"
npm ERR! cwd /home/ciprian/workspace/netop-npm
npm ERR! node -v v0.10.15
npm ERR! npm -v 1.2.18
npm ERR! code ENEEDAUTH
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/ciprian/workspace/netop-npm/npm-debug.log
npm ERR! not ok code 0
Run Code Online (Sandbox Code Playgroud)

日志文件的业务端告诉我该用户不是可选的

86 error need auth auth and email required for publishing
86 error need auth You need to authorize this machine using `npm adduser`
87 error System Linux 3.11.0-18-generic
88 error command "/usr/bin/nodejs" "/usr/bin/npm" "--registry=http://internal-npm:4873" "--ca=null" "publish"
89 error cwd /home/ciprian/workspace/netop-npm
90 error node -v v0.10.15
91 error npm -v 1.2.18
92 error code ENEEDAUTH
93 verbose exit [ 1, true ]
Run Code Online (Sandbox Code Playgroud)

现在,鸡和蛋问题是Sinopia不支持npm adduser,但有自己的用户管理,就像我上面提到的.此外,npm需要通过创建的有效用户npm adduser,但由于内部Sinopia服务器在不支持的命令处抛出错误,因此失败.

ale*_*lex 25

首先,它不是"鸡和蛋"的问题.

"npm adduser"做了两件事:

  1. 它在远程服务器上创建一个新用户,或验证它是否存在
  2. 它将_auth添加到你的.npmrc中

如果用户不存在,Sinopia会抱怨,如果确实存在,它会愉快地报告成功.


那么,你要做的就是:

  1. 添加user/pass到config.yaml(参见josh的回答)并重新启动sinopia服务器
  2. npm adduser --registry http://internal-npm:4873/

是的,"adduser"命令令人困惑,因为它实际上不会添加新用户.它只会验证用户是否存在于配置中.

如果需要,可以使用"npm login"命令.即使它完全相同,它也不那么令人困惑.:)


其次,将它添加到你的package.json:

"publishConfig": {
  "registry": "http://internal-npm:4873/"
}
Run Code Online (Sandbox Code Playgroud)

这样,npm将不再将其发布到公共注册表,即使它是默认注册表.


最后,您不能使用相同的npmrc同时使用两个注册表(npmjs和您的私有注册表).它比你想象的更不安全.

在大多数情况下都可以,但是如果你必须同时使用它们(例如,你同时维护公共和私有包),使用yapm而不是npm并将这样的内容写入你的.npmrc:

[registries."https://registry.npmjs.org/"]
_auth = (your auth string for public registry)

[registries."http://internal-npm:4873/"]
_auth = (your auth string for private registry)
always-auth = true
Run Code Online (Sandbox Code Playgroud)

在所有情况下,它都会阻止您将密码暴露给公共注册中心.


jos*_*736 7

Sinopia README告诉您到底要做什么.

添加新用户

添加新用户没有实用程序,但您至少可以在命令行上使用节点来生成密码.您需要编辑配置并手动添加用户.

启动节点并输入以下代码,将"newpass"替换为您要获取哈希值的密码.

$ node
> crypto.createHash('sha1').update('newpass').digest('hex')
'6c55803d6f1d7a177a0db3eb4b343b0d50f9c111'
> [CTRL-D]
Run Code Online (Sandbox Code Playgroud)

将新用户插入config.yaml文件.

然后你跑去npm adduser登录.(adduser是用于创建帐户和登录的命令; sinopia不支持创建部分.)


cda*_*nea 4

选项 1 有效,但我对此不太满意。所以我会继续寻找

是的,如果我添加有效的 npmjs.org 用户,然后切换存储库:

npm config set registry http://internal-npm:4873/
Run Code Online (Sandbox Code Playgroud)

如果 Sinopia 中存在相同的用户/通行证,则发布命令将起作用

npm publish --registry=http://internal-npm:4873/
Run Code Online (Sandbox Code Playgroud)

缺点是,如果有人忘记显式设置私有注册表,发布将在全球 npmjs.org 上 100% 工作,这将是一场灾难。

  • 为了避免您提到的缺点,请添加下面[alex的回答](/sf/answers/1589163061/)中提到的“publishConfig”。这限制了包在包本身内的发布位置。因此,即使有人忘记为 npm 设置注册表,发布仍然会转到该项目的正确注册表。 (3认同)