npm 發布包遇到的問題


目錄

引子

雖然有發布過包的經歷,但沒有發布過自己的包,於是就參照 npm developer guide 嘗試了一下,有了下面的收獲。

403 Forbidden

按照文檔中的步驟,注冊登錄后,准備好了庫,然后執行 npm publish,報了下面的錯誤:

Error: 403 Forbidden - PUT https://registry.npmjs.org/xx - You do not have permission to publish "xx". Are you logged in as the correct user?

查詢資料后,發現了這個 issue,原來是因為公開的庫里面,已經有了同名的庫。由於是免費的賬號,所以想在 npm 上發包,要么換個名稱,要么花錢創建私有包。還有一種方式就是在內網搭建自己的服務。

Error: 402 Payment Required

換了個名字,想起了自己見過的庫,就模仿加了個 @ 前綴的包,再次發布的時候,報了下面的錯誤:

Error: 402 Payment Required - PUT https://registry.npmjs.org/@xx/xx - You must sign up for private packages

查看文檔,發現 @npm/package-name 這種形式的包名,是有作用域的包名形式,執行 npm publish 的時候默認是發布私有的包。因此,第一種方式是花錢買私有包的服務,另外一種方式就是指定參數,表示公開:

npm publish --access public

需要注意的是這種形式的包名跟 npm 賬戶有對應關系,不能隨便填寫。

npm init --scope=@my-org

這種形式表示是一個組織,my-org 對應是 npm 中的組織名。

npm init --scope=@my-username

這種形式表示是個人,my-username 對應是 npm 中的用戶名。

對舊包的處理

在嘗試的過程中,發布了一些包,想着只是測試的包,想要移除掉,但 npm 官方很不推薦這種做法,推薦用 npm deprecate 指令,告知安裝者相關信息,例如“我不再維護這個庫了,請不要使用”。

npm deprecate package-name "This is test package, do not use it!"

其中 package-name 是指發布的包的名稱,可能跟庫的名稱不一樣。

發布成功了,但在 npm 上找不到包

在一次發布中,看到發布成功的提示,但到 npm 賬戶發現沒有相關的包。

反復嘗試了幾次,發現原來是因為自己本地 registry 指向了內網的一個地址,並沒有指向 npm 官方的地址 https://registry.npmjs.org/

所以發包的時候,先確定一下發布的指向:

npm config get registry
或
npm config list

如果發現指向不對,有兩種修改的方式:
方式 1:使用 npm config set registry 改成對應的指向,但這個是全局修改,之后如果需要發布其它指向的包,又要修改回來。

方式 2:執行指令時添加 --registry 參數
package.json 中添加參數:

"publishConfig": { "registry": "https://npm.pkg.github.com/" }

登錄的時候,添加對應的參數:

npm login --registry=https://registry.npmjs.org/

在使用 npm deprecate 指令的時候,如果本地 registry 指向不對,也要添加 --registry 參數才會有效。

如何判斷 npm 賬戶是否已登錄

由於發布的包有不同的 registry 指向,在發布包的時候,登錄要指向不同的源,所以發布之前想要看看是否已登錄。

查看了文檔,沒有找到查看登錄狀態的特定命令,但可以使用能觸發登錄檢查的命令,從側面看是否已登錄。

很容易想到的就是 npm login 命令,但登錄過一次后,再執行時還是提示輸入賬號密碼。

后來發現了一個簡單的指令 npm whoami ,這個指令只能在登錄狀態下執行,沒有登錄就會提示:

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

需要注意的是,這指令不帶 registry 參數時,會指向 npm 默認的 registry ,如果這個不匹配,也是沒有效果的。

當有多個 registry 時,一定要注意,不少的指令都需要一致的 registry 才有效。

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM