天天看點

釋出 JavaScript 開源項目指南

你剛剛完成自己第一個javascript庫的開發,同時你認為它可以幫助到其他人。你已經聽到人們讨論“開源運動”或“github履歷”,但你在共享軟體這方面上仍然是個新手。

釋出 JavaScript 開源項目指南

讓你電腦上的源代碼能夠得到别人的信任,并且在他們自己的項目中使用你的庫,你需要完成幾個重要的步驟。這篇文章就是圍繞這一過程來組織。

釋出 JavaScript 開源項目指南

庫檔案的原來的樣子

讓人們使用你的代碼的第一步是,讓你的代碼在網上可用!當今托管代碼流行的地方是github,本指南将使用它,但是你也可以使用任何你熟悉的托管網站。

<a target="_blank"></a>

如果你還沒有一個github賬号,把這篇文章先放放,去建立一個。如果有一個?很好!現在來建立一個新的倉庫。

釋出 JavaScript 開源項目指南

我們的新倉庫

這時,您應該有一個不錯的倉庫,裡面都是你寫的代碼。拍拍自己的後背,慶祝一下你的第一個開源項目。做到這一步,現在請豐富你的readme.md檔案。這樣人們可以知道項目用途。

釋出 JavaScript 開源項目指南

初始化狀态的倉庫

想象你是無辜的 javascript 程式員先生或女士。你偶然發現這個倉庫。你認為,”嘿,這填補了我的一個需求!“作為一個javascript開源社群的成員,你需要知道有一些開放源碼項目的品質标準。除非它符合這些标準,不然你不可能使用這些代碼。

讓你的代碼符合這些标準!

與javascript社群特别相關的兩個标準是依賴管理和測試。

當你的項目依賴于外部庫或子產品,你需要一個簡單的方法來管理這些依賴關系。當然,你可能隻是簡單地複制并粘貼另一個庫的源碼到你的項目源碼,但這很難處理版本變更和確定你的依賴關系的準确性。這就是為什麼依賴管理器可以使你變得更輕松。它允許使用者調用’install[library]‘,來擷取所有依賴項庫的最新版本或他們的代碼所依賴的任何其他庫。

在javascript領域,有一個流行的依賴管理器 npm。這篇文章将使用npm作為依賴管理,但是你可以使用其他任何你覺得合适的工具。

首先,你需要使用指令“npm init”來建立一個新的npm項目。最好猜猜這些配置選項,你可能會改變其中的一些。

釋出 JavaScript 開源項目指南

如果你看看backbone.freeze的配置選項,您将看到兩個重要的事情。第一個是許可證,回憶我讓你在上面思考的有關許可證的事項?這就是填寫許可證的地方。

同時,你會發現有一個測試指令。您現在可以忽略,或者寫上“gulp test”——我将馬上解釋它的含義。

現在您已經準備好去測試。

測試是讓使用者看到你的庫是實際如何工作的一種簡單方法,同時能讓使用者信任你的代碼能做到你所聲稱能做的事情,即使是邊界情況。是以讓我們為你的插件編寫一些測試!

首先,你需要設定将用來編寫測試的工具。本教程将使用以下:

<a href="http://mochajs.org/" target="_blank">mocha</a>

<code>npm install--save-dev mocha chai</code>

現在你有npm,你準備安裝它們。

(mocha是一個javascript測試架構。chai是一個javascript預測庫,對測試很有用)。

在你的目錄變得混亂之前(新的package.json和node_modules目錄之間,你可能感覺有點擁擠),是時候遵循标準的約定并移動你的源代碼到“src”目錄了。

此外,您将使用另一個額外的組織方式,建立一個名為“spec”的目錄,在這裡面你将放置所有的測試。

確定你所有的測試都可以使用chai,你需要在spec目錄中建立一個“setup.js”檔案。在該檔案中,您需要設定chai

<code>'use strict';</code>

<code>var chai = require('chai');</code>

<code>global.expect = chai.expect;</code>

你可通過輸入“mocha spec/ *.js”來檢驗以上是否成功,可以看到測試運作成功(包含0個測試)。

釋出 JavaScript 開源項目指南

花一些時間來編寫測試。它們都應該放在spec目錄中。

…都做完了嗎?好。現在,當你再次運作“npm test”指令,你應該看到,所有的測試用例都在運作,且通過。(如果它們沒有通過,修複之後再繼續!)

釋出 JavaScript 開源項目指南

既然你已經做完了,把新代碼上傳到github。

大多數javascript開發人員使用某種自動化工作流,使編寫和運作測試的過程更容易一些。有幾種常用的工具,但是這篇文章将使用 gulp。你在本教程中會用它來幹幾件事,現在它将幫助啟動測試。首先,安裝 gulp 和 gulp mocha 插件。

<code>npm install--save-dev gulp gulp-mocha</code>

你需要在父目錄中添加一個gulpfile.js,它包含以下行:

<code>require('./gulp');</code>

該檔案表示,它将監視一個名為“gulp”的目錄,是以你需要建立它。在這個目錄中,建立一個index.js檔案,它是被gulp執行所有javascript檔案的入口點。然後建立一個名為“task”的檔案夾——index.js将引用該目錄下的所有檔案,以便gulp知道它們。

<code>'use strict';var fs = require('fs');</code>

<code>var tasks = fs.readdirsync('./gulp/tasks');</code>

<code>var gulp = require('gulp');tasks.foreach(function(task) {</code>

<code>require('./tasks/' + task);</code>

<code>});</code>

現在進行最後一點複制-粘貼。在你的task目錄,建立一個測試任務,它将啟動所有測試:

<code>var gulp = require('gulp');</code>

<code>var mocha = require('gulp-mocha');gulp.task('test', function () {</code>

<code>return gulp.src(['./spec/setup.js', './spec/**/*.spec.js'], { read: false })</code>

<code>.pipe(mocha({ reporter: 'spec' }));</code>

您會注意到test.js這個gulp task引用了spec目錄,并加載了setup.js檔案。

在這之後,你的目錄應該像這樣:

釋出 JavaScript 開源項目指南

是否記得我在文章中提到的npm初始化步驟“gulp test”?這裡是它存在的地方。使用你喜歡的文本編輯器打開package.json,并確定它有這樣一段腳本:

<code>"scripts": {</code>

<code>"test": "gulp test"</code>

<code>},</code>

package.json 中的這一行,告訴 npm 如何執行你的測試。

這是一個很好的測試,以確定你在正确地做所有事:在你的項目目錄,運作“npm test”,并確定你看到相同的測試輸出。

既然您已經有一個全面的測試套件,那您需要一種方法來向使用者保證,你釋出的新版本不會破壞任何功能。這就是持續內建。“持續內建”意味着将不斷測試代碼。(或表示代碼不斷更新,在每一次送出。)

這裡有很多工具可以使用。這篇文章将使用一個非常棒工具,名為travis ci,它為任何公共的github項目提供免費的持續內建。

你需要做的第一件事是添加一個travis-ci配置檔案到你的倉庫。這個檔案會告訴travis你的項目語言。在那裡,travis可以判斷需要執行的指令,并運作你的測試。

<code>language: node_js</code>

釋出 JavaScript 開源項目指南

你可能會想在github頁面嵌入建構資訊,這樣一個感興趣的使用者一眼就可以看到,你的代碼是穩定且可信賴的。如果你點選倉庫名稱旁邊的圖檔(在頂部,顯示為“buid|passing”)應該會看到一個彈出框。選擇“markdown”并複制文本框的内容。你可以粘貼到你的readme.md檔案,并更新到github。如果你做對了,github頁面現在看起來應該像這樣:

釋出 JavaScript 開源項目指南

注意,你是如何一眼就可以看出這是通過所有的測試

幸運的是,有一個叫做webpack庫,使所有這些變的簡單!確定你的庫是打包的,這樣它對每個人都可用,無論他們使用什麼子產品系統(或不使用,視情況而定)。你需要一個名為“del”的工具來删除檔案。

<code>npm install--save-dev gulp-webpack del</code>

這裡說說打包過程是如何工作的:你需要建立一個名為“dist”的目錄(釋出的簡稱),這是“相容”版本庫的存放位置。你需要一個gulp任務來建立它,以及一個gulp任務來清理目錄。讓我們先從清理任務開始。

<code>'use strict';var gulp = require('gulp');</code>

<code>var del = require('del');gulp.task('clean', function (cb) {</code>

<code>del([</code>

<code>'dist'</code>

<code>], cb);</code>

這不是那麼糟糕!您隻需建立一個任務,删除dist檔案夾。現在看看dist。

<code>var webpack = require('gulp-webpack');</code>

<code>gulp.task('dist', function () {</code>

<code>return gulp.src('src/[library entry point (i.e. backbone.freeze.js)]')</code>

<code>.pipe(webpack({</code>

<code>output: {</code>

<code>filename: '[name of final file (i.e. backbone.freeze.js)]',</code>

<code>librarytarget: 'umd'</code>

<code>externals: {</code>

<code>backbone: {</code>

<code>amd: 'backbone',</code>

<code>commonjs: 'backbone',</code>

<code>commonjs2: 'backbone',</code>

<code>root: 'backbone'</code>

<code>underscore: {</code>

<code>amd: 'underscore',</code>

<code>commonjs: 'underscore',</code>

<code>commonjs2: 'underscore',</code>

<code>root: '_'</code>

<code>devtool: 'source-map'`</code>

<code>}</code>

<code>}))</code>

<code>.pipe(gulp.dest('dist'));</code>

在括号部分内,分别填寫庫入口點的檔案名和輸出檔案的最終名。你可以通過在指令行運作“gulp dist”和“gulp clean”來確定一切正常運作,并檢查檔案夾和檔案是否都建立或者移除。

釋出 JavaScript 開源項目指南

注意:dist檔案夾在dist任務後出現,clean任務後消失。

現在你的庫馬上可以廣泛使用了!剩下要做的唯一一件事是…

想想前面的步驟,您通過依賴管理設定您的項目?不久後的某一天,某天真的javascript程式員先生或女士,能夠在她喜歡的依賴管理工具下輸入 ‘install [你的庫]’,它就工作了!

在以下步驟,你會将代碼被納入公共倉庫,并使用這兩種常用的依賴管理工具,使其可用于所有其他開發人員。

bower和npm都依賴于配置檔案。(npm的package.json。)因為你沒有一個bower配置檔案,您需要做的第一件事是寫一個gulp任務來為你生成一個。你可能會問“為什麼?“。因為你不想維護兩個不同的配置檔案。一旦你準備好釋出,您可以通過運作“gulp dist”來為所有部件的釋出做準備。

你需要為此安裝兩個庫。

<code>npm install--save-dev gulp-rename gulp-json-editor</code>

現在你需要準備:

<code>"use strict";</code>

<code>var rename = require('gulp-rename');</code>

<code>var jeditor = require('gulp-json-editor');</code>

<code>var _ = require('underscore');</code>

<code>gulp.task('bower', function () {</code>

<code>return gulp.src('./package.json')</code>

<code>.pipe(rename('bower.json'))</code>

<code>.pipe(jeditor(function (json) {</code>

<code>return _.pick(json, [</code>

<code>'name',</code>

<code>'version',</code>

<code>'description',</code>

<code>'main',</code>

<code>'keywords',</code>

<code>'author',</code>

<code>'license',</code>

<code>'dependencies'</code>

<code>]);</code>

<code>.pipe(gulp.dest('.'));</code>

修改gulp/tasks/dist.js中gulp.task處,包含以下代碼(['bower']):

<code>gulp.task('dist', ['bower'], function () {</code>

這確定了dist運作時,bower任務參與了。

現在您需要釋出代碼到這兩個倉庫。首先,你需要為您的庫選擇一個還沒有使用的名稱。搜尋npm registry和 bower registry ,以確定一個你想要的名字沒被使用。(如果被用了,你需要改變package.json。)

在你釋出你的代碼之前,更新您的文檔讓使用者知道如何擷取代碼。添加這些到readme.md(填入庫名):

<code>#installing</code>

<code>freeze is available on npm and bower as "backbone.freeze"</code>

<code>```</code>

<code>bower install backbone.freeze</code>

<code>or</code>

<code>npm install backbone.freeze</code>

npm釋出很簡單——隻是設定 npm 作者資訊:

<code>npm set init.author.name "your name"</code>

<code>npm set init.author.email "[email protected]"</code>

<code>npm set init.author.url "http://yourblog.com"</code>

<code>npm adduser</code>

輸入 ‘npm publish. /’.

好了!你已經正式釋出在npm !

釋出一個包到bower有點複雜。

首先,在你項目的git倉庫中建立一個标簽。

<code>'git tag -a [version] -m "released [version]"'</code>

…”([version])”是package.json中的目前版本号。

接下來,将該标記上傳github。

<code>'git push origin [version]'</code>

然後用bower注冊您的項目。

<code>'bower register [package name] [git endpoint]'</code>

…”[package name]”是庫的名稱(對我來說,它是“backbone.freeze”),“[git endpoint]”是github上的.git檔案的url(對我來說,它是“git://github.com/benmanbs/freeze.git”)。

現在庫已經注冊,當你把新的标簽更新到github,它會在bower自動更新。

我編寫的一些腳本,你可能用得上。

腳本需要版本類型(大版本号,小版本号或更新檔号),在package.json中添加你的版本号,生成一個bower.json和dist,并同時釋出到npm和bower。

本文來自雲栖社群合作夥伴“linux中國”,原文釋出日期:2015-08-10

繼續閱讀