前言
把node文件拷貝寫成npm包官硝,并發(fā)布
npm插件發(fā)布
發(fā)布npm其實是一件很簡單的事情,只是因為長時間不發(fā)布會忘記短蜕,又得上網(wǎng)去查一下氢架,所以就寫篇文章記錄一下
新建文件目錄
- 新建目錄,取名任意
- 運行命令生成
package.json
npm init --yes
安裝依賴
如果項目中還需要其他依賴朋魔,可以向正常開發(fā)時一樣通過npm install xxx
安裝
不過這里有一點需要注意的是岖研,-S
、--save
和--save-dev
的區(qū)別警检,因為通常在開發(fā)項目的時候這三個是沒有什么本質(zhì)區(qū)別的孙援,但是在開發(fā)npm包
的還是有區(qū)別的
-
-S
和--save
下載的插件會被寫入dependencies
,并且我們在安裝自定義的插件時,會一塊被下載 -
--save-dev
下載的插件會被寫入devDendencies
扇雕,這個只是在開發(fā)的時候使用赃磨,并不會隨著自定義插件一塊被安裝
完善package.json
有幾個重要的信息是一定要填寫的
-
name
別人安裝這個插件需要通過npm install xxx
,來安裝這個xxx
對應(yīng)的是name
的value
-
version
插件的版本,每次重新發(fā)布都需要重新這個版本后洼裤,不然發(fā)布會失敗 -
main
入口文件
其他可以看需要填寫
{
"name": "node-fs-copy", //發(fā)布的包名,默認(rèn)是上級文件夾名。不得與現(xiàn)在npm中的包名重復(fù)腮鞍。包名不能有大寫字母/空格/下滑線!
"version": "1.0.0",//你這個包的版本值骇,默認(rèn)是1.0.0。對于npm包的版本號有著一系列的規(guī)則移国,模塊的版本號采用X.Y.Z的格式吱瘩,具體體現(xiàn)為:
1、修復(fù)bug迹缀,小改動使碾,增加z。
2祝懂、增加新特性票摇,可向后兼容,增加y
3砚蓬、有很大的改動矢门,無法向下兼容,增加x
"description": "",
"main": "index.js",//入口文件,默認(rèn)是Index.js灰蛙,可以修改成自己的文件,這個很重要祟剔,當(dāng)你在實際項目使用的時候,let a = require("包名")摩梧,它就去會去找對應(yīng)的文件路徑哦物延。
"scripts": { // 快捷命令,在package.json同目錄下輸入命令 npm run 鍵 就會執(zhí)行 相對應(yīng)的命令
"bulid": "npx webpack --config myConfig.js" //例如 輸入 npm run bulid 就會執(zhí)行npx webpack --config myConfig.js的命令 仅父。
},
"keywords": [ // npm搜索的關(guān)鍵字
"node",
"fs",
"copy"
],
"publishConfig": {
"registry": "" // 發(fā)布的npm地址
},
"repository": {
"type": "git",
"url": "git+https://github.com/xxxx" // 代碼的git地址
},
"author": "zxw",
"license": "ISC",//這個直接回車叛薯,開源文件協(xié)議吧,也可以是MIT驾霜,看需要吧案训。
"dependencies": { // 生產(chǎn)環(huán)境所依賴的包
"jquery": "^3.4.1",
"sea": "^1.0.2"
},
"devDependencies": { // 開發(fā)環(huán)境所依賴的包
"webpack": "^4.41.6"
}
}
確定入口文件為index.js之后,并寫入代碼,注意引入和導(dǎo)出都需要通過node的方式
- index.js
const { exists, copyDir} = require('./lib/copy')
const fsCopy = (sourcePath, deptPath)=> {
exists(sourcePath,deptPath, copyDir)
}
module.exports = {
fsCopy
}
- /lib/copy.js
const fs = require('fs')
/**
* 復(fù)制一個文件夾下的文件到另一個文件夾
* @param src 源文件夾粪糙,即需要寫出的文件
* @param dst 目標(biāo)文件夾强霎,需要寫入的文件
*/
const copyDir = function (src, dst) {
// 讀取目錄中的所有文件/目錄
fs.readdir(src, function (err, paths) {
if (err) {
throw err
}
paths.forEach(function (path) {
const _src = src + '/' + path
const _dst = dst + '/' + path
let readable;
let writable
fs.stat(_src, function (err, st) {
if (err) {
throw err
}
// 判斷是否為文件
if (st.isFile()) {
// 創(chuàng)建讀取流
readable = fs.createReadStream(_src)
// 創(chuàng)建寫入流
writable = fs.createWriteStream(_dst)
// 通過管道來傳輸流
readable.pipe(writable)
}
// 如果是目錄則遞歸調(diào)用自身
else if (st.isDirectory()) {
exists(_src, _dst, copyDir)
}
})
})
})
}
/*
* 判斷當(dāng)前目標(biāo)文件是否存在
* 如若不存在需要先進(jìn)行創(chuàng)建
* */
const exists = function (src, dst, callback) {
// 如果路徑存在,則返回 true蓉冈,否則返回 false城舞。
if (fs.existsSync(dst)) {
callback(src, dst)
} else {
fs.mkdir(dst, function () {
callback(src, dst)
})
}
}
module.exports = {
exists,
copyDir
}
測試
這一塊我只是進(jìn)行了比較簡單的測試,后續(xù)我會專門補(bǔ)一章關(guān)于插件測試的文章
發(fā)布
- 注冊npm賬號寞酿,通常npm可以通過關(guān)聯(lián)gitlab直接登錄
- 確定你當(dāng)前的鏡像指向npm鏡像而不是淘寶鏡像家夺,如果不確定可以直接執(zhí)行
npm config set registry https://registry.npmjs.org/
- 運行添加用戶命令,依次輸入用戶伐弹,密碼拉馋,郵箱。
npm addUser
- 確保當(dāng)前npm已經(jīng)在瀏覽器登錄情況下執(zhí)行發(fā)布命令
npm publish
如圖就是發(fā)布成功了
發(fā)布報錯
如果發(fā)布遇到403
報錯,很有可能是你的包名即package.json
里面的name
字段與npm
已經(jīng)有的插件名重復(fù)了煌茴,需要修改一下再重新發(fā)布
修改過名字依然報錯随闺, You cannot publish over the previously published versions: xxx
,說明這個版本已經(jīng)在npm
存在,需要修改版本號
迭代
后續(xù)內(nèi)容如果有變動蔓腐,每次重新發(fā)布的時候矩乐,都需要手動的更改package.json/version
的版本號,然后在執(zhí)行發(fā)布的命令
使用示例
安裝
npm install node-fs-copy
在node代碼中,本地拷貝測試
const { fsCopy } = require('node-fs-copy')
// 把內(nèi)容從本地D盤的test/test目錄回论,拷貝到test/test1目錄
fsCopy('d:/test/test', 'd:/test/test1')
服務(wù)器代碼拷貝
本地是沒有辦法直接拷貝服務(wù)器代碼的散罕,如果需要拷貝服務(wù)器代碼,需要滿足一個條件
- node服務(wù)端代碼傀蓉,與需要拷貝的文件在一個服務(wù)器上
比如作者的的服務(wù)器上的文件地址為/data/code-generator
欧漱,node服務(wù)也部署在同一服務(wù)器的另一個目錄內(nèi)
//在服務(wù)器上運行,表示把服務(wù)器的/data/code-generator文件內(nèi)的內(nèi)容僚害,拷貝到當(dāng)前項目的./temporary/test內(nèi)
fsCopy('/data/code-generator', './temporary/test')
完成拷貝后硫椰,可以使用打包插件把該內(nèi)容壓縮成zip包
,輸出到前端萨蚕,然后刪除該臨時文件./temporary/test
,再刪除zip包
附上常用命令
npm init --yes(初始化配置)
npm i (會根據(jù)package.json里面的鍵dependencies靶草,devDependencies來安裝相對應(yīng)的包)
npm i 包(默認(rèn)安裝一個最新的包,這個包在node_modules文件夾里面岳遥,并且會更新在你的package.json文件)
npm i 包@3.0.0(安裝一個指定版本的包奕翔,會更新在你的package.json文件)
npm i 包 --save-dev(安裝一個開發(fā)環(huán)境所需要的包,會更新在你的package.json文件)
npm uninstall 包(卸載一個包浩蓉,會更新在你的package.json文件)
npm update 包(更新此包版本為最新版本派继,會更新在你的package.json文件)
npm run 腳本鍵(會根據(jù)package.json里面的"scripts"里面的腳本鍵自動執(zhí)行相對于的值)
npm publish (根據(jù)package.json的name發(fā)布一個包)
npm unpublish 包名 --force(卸載npm網(wǎng)站上自己上傳的包)