把node文件拷貝寫成npm包,并發(fā)布

前言

把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)的是namevalue
  • 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
addUser.png.png
  • 確保當(dāng)前npm已經(jīng)在瀏覽器登錄情況下執(zhí)行發(fā)布命令
npm publish
2089720a305dac8995cb940c8780fb7.png

如圖就是發(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)站上自己上傳的包)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捻艳,隨后出現(xiàn)的幾起案子驾窟,更是在濱河造成了極大的恐慌,老刑警劉巖认轨,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绅络,死亡現(xiàn)場離奇詭異,居然都是意外死亡嘁字,警方通過查閱死者的電腦和手機(jī)恩急,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纪蜒,“玉大人衷恭,你說我怎么就攤上這事〈啃” “怎么了随珠?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵灭袁,是天一觀的道長。 經(jīng)常有香客問我牙丽,道長简卧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任烤芦,我火速辦了婚禮,結(jié)果婚禮上析校,老公的妹妹穿的比我還像新娘构罗。我一直安慰自己,他們只是感情好智玻,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布遂唧。 她就那樣靜靜地躺著,像睡著了一般吊奢。 火紅的嫁衣襯著肌膚如雪盖彭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天页滚,我揣著相機(jī)與錄音召边,去河邊找鬼。 笑死裹驰,一個胖子當(dāng)著我的面吹牛隧熙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幻林,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼贞盯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沪饺?” 一聲冷哼從身側(cè)響起躏敢,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎整葡,沒想到半個月后件余,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡掘宪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年蛾扇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魏滚。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡镀首,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鼠次,到底是詐尸還是另有隱情更哄,我是刑警寧澤芋齿,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站成翩,受9級特大地震影響觅捆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麻敌,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一栅炒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧术羔,春花似錦赢赊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寥殖,卻和暖如春玩讳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嚼贡。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工熏纯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人编曼。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓豆巨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掐场。 傳聞我的和親對象是個殘疾皇子往扔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容