目錄
引子
雖然有發布過包的經歷,但沒有發布過自己的包,於是就參照 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
才有效。