1. 程式人生 > >Nodejs 釋出自己的npm包並製作成命令列工具

Nodejs 釋出自己的npm包並製作成命令列工具

近日當我在使用npm上已經存在的一個包時,發現它有bug;於是決定自己實現這個功能,自己寫一個npm包。

下面我記錄一下自己的實現過程。

1. npm init

選擇一個資料夾,然後用命令列cd進去,然後執行npm init,這時會生成一長串表單,根據自己的實際情況填寫內容 name:填寫你這個包的名字,預設是你這個資料夾的名字。不過這裡要著重說一下,最好先去npm上找一下有沒有同名的包。最好的測試方式就是,在命令列裡面輸入npm install 你要取的名字,如果報錯,那麼很好,npm上沒有跟你同名的包,你可以放心大膽地把包釋出出去。如果成功下載下來了。。。那麼很不幸,改名字吧。。。
version:你這個包的版本,預設是1.0.0
description:其實我也不知道是什麼,按回車就好了。。。,這個用一句話描述你的包是幹嘛用的
entry point:入口檔案,預設是Index.js,你也可以自己填寫你自己的檔名
test command:測試命令,這個直接回車就好了,因為目前還不需要這個。
git repository:這個是git倉庫地址,如果你的包是先放到github上或者其他git倉庫裡,這時候你的資料夾裡面會存在一個隱藏的.git目錄,npm會讀到這個目錄作為這一項的預設值。如果沒有的話,直接回車繼續。
keyword:這個是一個重點,這個關係到有多少人會搜到你的npm包。儘量使用貼切的關鍵字作為這個包的索引。我這個包嘛,第一是在express下工作的,然後又是一個外掛plugin,然後又是一個註冊路由route用的,而這個路由又是基於檔案目錄dir,所以很好就得出我的包的索引關鍵字。
author:寫你的賬號或者你的github賬號吧
license:這個直接回車,開原始檔來著。。。
然後它就會問你Are you ok?
回車Ok!
然後我們回到我們的檔案目錄裡面去看一看,發現多出來一個package.json檔案 然後,在目錄下新建一個index.js檔案,或者你剛才修改了那個entry point的值,那麼你這個檔名也跟著改為那個值。

我的npm工程目錄結構就是這樣的,注意其中的bin資料夾是我為了製作命令列工具才生成的,後面會講到怎麼生成命令列工具;當然,如果那不想生成命令列工具,這個資料夾就不需要了。 因為我把封裝好的程式碼都扔在lib裡面,所以,index.js裡面也就一句話:


module.exports=require('./lib')

然後,最重要的,寫好README.md,一個給大家描述你的包的markdown檔案,如果大家都不知道你的程式碼是做什麼的,會有人去下載你的程式碼嗎?哦,對了,最好寫英文。

2. npm publish

寫完自己的npm包,測試執行沒問題後就可以釋出到npm上 首先得註冊個npm帳號 用npm命令登陸一下
然後,在你的目錄下使用npm publish
注意:一般情況下,一旦你要修改你已經發布後的程式碼,然後又要執行釋出操作,務必到package.json裡面,把version改一下,比如從1.0.0改為1.0.1,然後在執行npm publish,這樣就可以成功釋出了。

3. 生成命令列工具

在使用 Nodejs 過程中,有很多包都支援全域性安裝,提供一個命令,然後在命令列我們就可以完成一些任務。有時候我們也需要開發這樣的命令工具。在Node.js 中發現弄個命令列工具特別輕鬆。我使用的是commander包來生成命令列工具
$ npm install commander
然後cd到bin目錄下,新建一個.js檔案(名字自取),編寫程式碼,在js檔案頂部加上#!/usr/bin/env node 例如我的geAsar.js:
#!/usr/bin/env node
var asar = require('../lib/geAsar')
var program = require('commander');

program.version('v' + require('../package.json').version)
       .description('Manipulate asar archive files')

program.command('pack <dir> <output>')
       .alias('p')
       .description('create asar archive')
       .action(function (__dirpath, output) {
         asar.geAsar(__dirpath,output);
         console.log(output+"檔案成功生成");
       })
program.parse(process.argv)

if (program.args.length === 0) {
  program.help()
}

然後還需在package.json中新增
"bin": {
    "geAsar": "./bin/geAsar.js"
  },

執行 node bin/geAsar.js 會顯示當前資料夾下的所以檔案和資料夾名。這個玩意兒真的跑起來了. 全域性執行命令除錯

install
如果在專案目錄下執行沒有問題,可以將當前目錄模組安裝到全域性,也可以採用此方法來更新你的命令列工具
sudo npm install . -g

link
或者目錄輸入 npm link 會自動新增全域性的 symbolic link ,然後就可以使用自己的命令了。 (我用的是這個)

參考內容:https://segmentfault.com/a/1190000002918295

   http://www.jianshu.com/p/36d3e0e00157