无论如何设置npmlogin`npmlogin`没有阅读input从STDIN?

我试图在npm publish容器中自动化npm publish但是当$npm login命令尝试从提示中读取用户名和电子邮件时,我遇到了麻烦:

 npm login << EOF username password email EOF 

它在terminalbash中工作,但不在没有打开STDIN的容器中,并显示以下错误消息:

 Username: Password: npm ERR! cb() never called! npm ERR! not ok code 0 

根据npm-adduser :

从提示中读入用户名,密码和电子邮件。

那么如何在不打开STDIN的情况下运行npm login呢?

TL; DR:直接向registry发出HTTP请求:

 TOKEN=$(curl -s \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X PUT --data '{"name": "username_here", "password": "password_here"}' \ http://your_registry/-/user/org.couchdb.user:username_here 2>&1 | grep -Po \ '(?<="token": ")[^"]*') npm set registry "http://your_registry" npm set //your_registry/:_authToken $TOKEN 

合理

幕后npm adduser向registry发出HTTP请求。 不要强迫adduser按照你想要的方式行事,你可以不经过cli就直接向registry发送请求,然后用npm set auth令牌。

源代码build议您可以使用以下有效负载向http://your_registry/-/user/org.couchdb.user:your-username发出PUT请求

 { name: username, password: password } 

这将在registry中创build一个新的用户。

非常感谢@shawnzhufind了一个更清洁的方法来解决这个问题。

期望脚本为我工作。 你需要确保安装期望,这个命令应该做的Ubuntu的:

 apt-get install expect-dev 

你的脚本可能看起来像这样(npm_login_expect):

 #!/usr/bin/expect -f # set our args into variables set i 0; foreach n $argv {set "p[incr i]" $n} set timeout 60 #npm login command, add whatever command-line args are necessary spawn npm login match_max 100000 expect "Username" send "$p1\r" expect "Password" send "$p2\r" expect "Email" send "$p3\r" expect { timeout exit 1 eof } 

然后像这样调用它:

 expect -f npm_login_expect myuser mypassword "myuser@domain.com" 

对于在这个重复的职位 ke_wa公开的解决scheme2已经工作。

混搭:

 export NPM_USERNAME=mUs34 export NPM_PASSWORD=mypassW0rD export NPM_EMAIL=user@domain.com npm adduser<<! $NPM_USERNAME $NPM_PASSWORD $NPM_EMAIL ! 

您可以使用预期脚本,也可以编写使用pty.js的节点脚本。