Julia 中設(shè)有包管理器,當(dāng)你安裝了擴(kuò)展包時(shí),你可以看到它的源代碼和完整的開(kāi)發(fā)歷史。你也可以修改擴(kuò)展包,并使用 git 提交它們,為修復(fù)和增加擴(kuò)展包功能做貢獻(xiàn)。相似地,這個(gè)系統(tǒng)設(shè)計(jì)用來(lái)當(dāng)你想要?jiǎng)?chuàng)建一個(gè)新擴(kuò)展包時(shí),最簡(jiǎn)單的方法就是利用包管理器中提供的基礎(chǔ)設(shè)施。
由于擴(kuò)展包存儲(chǔ)于 git 倉(cāng)庫(kù)中,所以在做擴(kuò)展包開(kāi)發(fā)之前,你需要先設(shè)置如下全局 git 配置:
$ git config --global user.name "FULL NAME"
$ git config --global user.email "EMAIL"
FULL NAME
是你真實(shí)的全名(雙引號(hào)之間允許有空格)并且 EMAIL
是你真實(shí)的郵箱地址。
盡管創(chuàng)建和發(fā)布 Julia 擴(kuò)展包時(shí)使用 GitHub 并不是必要的,然而大多數(shù) Julia 擴(kuò)展包都存在 GitHub 上并且包管理器知道如何正確地格式化源 URL,并在其他方面上順利的使用服務(wù)。我們建議你創(chuàng)建一個(gè)免費(fèi)賬號(hào) 在 GitHub 上然后做:
$ git config --global github.user "USERNAME"
在這里 USERNAME
是你 GitHub 上正確的用戶名。只要你做了這一點(diǎn),包管理器就知道你的 GitHub 用戶名然后可以配置相關(guān)事項(xiàng)。你還需要上傳 你的 SSH 公鑰到 GitHub 上并設(shè)置一個(gè) SSH 代理在你的開(kāi)發(fā)機(jī)器上,這樣你可以最簡(jiǎn)單的推送你的修改。在將來(lái),我們會(huì)讓這個(gè)系統(tǒng)具有擴(kuò)展性,支持更多其它的常見(jiàn) git 工具例如 BitBucket 并且允許開(kāi)發(fā)者選擇他們所喜歡的。
假如你想創(chuàng)建一個(gè)新的 Julia 擴(kuò)展包,名為 FooBar
。首先,你需要 Pkg.generate(pkg,license)
,其中 pkg
是新擴(kuò)展包的名字并且 license
是生成器知曉的許可的名字:
julia> Pkg.generate("FooBar","MIT")
INFO: Initializing FooBar repo: /Users/stefan/.julia/v0.3/FooBar
INFO: Origin: git://github.com/StefanKarpinski/FooBar.jl.git
INFO: Generating LICENSE.md
INFO: Generating README.md
INFO: Generating src/FooBar.jl
INFO: Generating test/runtests.jl
INFO: Generating .travis.yml
INFO: Committing FooBar generated files
這樣創(chuàng)建了一個(gè)目錄 ~/.julia/v0.3/FooBar
,將它初始化為一個(gè) git 倉(cāng)庫(kù),生成所有包需要有的一系列文件,并把它們提交到倉(cāng)庫(kù):
$ cd ~/.julia/v0.3/FooBar && git show --stat
commit 84b8e266dae6de30ab9703150b3bf771ec7b6285
Author: Stefan Karpinski <stefan@karpinski.org>
Date: Wed Oct 16 17:57:58 2013 -0400
FooBar.jl generated files.
license: MIT
authors: Stefan Karpinski
years: 2013
user: StefanKarpinski
Julia Version 0.3.0-prerelease+3217 [5fcfb13*]
.travis.yml | 16 +++++++++++++
LICENSE.md | 22 +++++++++++++++++++++++
README.md | 3 +++
src/FooBar.jl | 5 +++++
test/runtests.jl | 5 +++++
5 files changed, 51 insertions(+)
此時(shí),包管理器知道 MIT "Expat" 證書(shū)用 "MIT"
表示,Simplified BSD 證書(shū)用 "BSD"
表示,2.0 版本的 Apache 軟件證書(shū)用 "ASL"
表示。如果你想要使用不同的證書(shū),你可以讓我們把它添加到擴(kuò)展包生成器上,或者就選這三者之一然后在生成之后修改 ~/.julia/v0.3/PACKAGE/LICENSE.md
文件。
如果你創(chuàng)建了一個(gè) GitHub 賬戶并且配置了 git,Pkg.generate
將會(huì)設(shè)置一個(gè)合適的源 URL 給你。它還會(huì)自動(dòng)生成 .travis.yml
文件來(lái)使用 Travis 自動(dòng)測(cè)試服務(wù)。你可以在 Travis website 上測(cè)試你的擴(kuò)展包倉(cāng)庫(kù),但是只要你做了這個(gè)它就已經(jīng)開(kāi)始測(cè)試了。當(dāng)然,所有的默認(rèn)測(cè)試是查證 using FooBar
能否在 Julia 上工作。
只要你提交了一些內(nèi)容,那么你會(huì)為測(cè)試 FooBar
是否可以工作而感到高興,你可能想要一些其他人來(lái)測(cè)試一下。首先,你需要?jiǎng)?chuàng)建一個(gè)遠(yuǎn)程倉(cāng)庫(kù)并把你的代碼推送進(jìn)去;我們不會(huì)自動(dòng)的為你做這件事,但是未來(lái)將會(huì),這配置起來(lái)并不難[3]。只要你完成了這個(gè),只需將發(fā)布的倉(cāng)庫(kù)的 URL 發(fā)給他們就可以請(qǐng)讓他們來(lái)試一下你的代碼 - 像這樣:
git://github.com/StefanKarpinski/FooBar.jl.git
對(duì)于你的擴(kuò)展包而言,它將具有你的 GitHub 用戶名和你的擴(kuò)展包名,但是你明白是什么意思。收到你發(fā)的 URL 的人們可以使用 Pkg.clone
來(lái)安裝擴(kuò)展包并測(cè)試它:
julia> Pkg.clone("git://github.com/StefanKarpinski/FooBar.jl.git")
INFO: Cloning FooBar from git@github.com:StefanKarpinski/FooBar.jl.git
[3]: 極度推薦安裝并使用 GitHub 的 "hub" 工具。它允許你在擴(kuò)展包倉(cāng)庫(kù)中像運(yùn)行
hub create
那樣做事,然后它會(huì)通過(guò) GitHub 的 API 自動(dòng)創(chuàng)建。
一旦你決定 FooBar
已經(jīng)準(zhǔn)備好注冊(cè)成為一個(gè)官方正式擴(kuò)展包,你可以把它添加到你的本地 METADATA
的拷貝,并命名為 Pkg.register
:
julia> Pkg.register("FooBar")
INFO: Registering FooBar at git://github.com/StefanKarpinski/FooBar.jl.git
INFO: Committing METADATA for FooBar
這會(huì)在 ~/.julia/v0.3/METADATA
倉(cāng)庫(kù)中創(chuàng)建一次提交:
$ cd ~/.julia/v0.3/METADATA && git show
commit 9f71f4becb05cadacb983c54a72eed744e5c019d
Author: Stefan Karpinski <stefan@karpinski.org>
Date: Wed Oct 16 18:46:02 2013 -0400
Register FooBar
diff --git a/FooBar/url b/FooBar/url
new file mode 100644
index 0000000..30e525e
--- /dev/null
+++ b/FooBar/url
@@ -0,0 +1 @@
+git://github.com/StefanKarpinski/FooBar.jl.git
然而,這次提交只是本地可見(jiàn)的。為了能將它公諸于世,你需要將你的本地 METADATA
上傳到正式庫(kù)中合并。Pkg.publish()
命令將在 GitHub 上創(chuàng)建 METADATA
倉(cāng)庫(kù)的分支,并將你的修改提交到分支上,并打開(kāi)一個(gè)拉取請(qǐng)求:
julia> Pkg.publish()
INFO: Validating METADATA
INFO: No new package versions to publish
INFO: Submitting METADATA changes
INFO: Forking JuliaLang/METADATA.jl to StefanKarpinski
INFO: Pushing changes as branch pull-request/ef45f54b
INFO: To create a pull-request open:
https://github.com/StefanKarpinski/METADATA.jl/compare/pull-request/ef45f54b
由于各種各樣的原因 Pkg.publish()
有時(shí)并不會(huì)成功。在那些情況下,你可能在 GitHub 上做了一個(gè)拉取請(qǐng)求,這并不難。
只要 FooBar
擴(kuò)展包的 URL 在正式 METADATA
倉(cāng)庫(kù)中注冊(cè),人們就知道從哪里克隆這個(gè)擴(kuò)展包,但是這并沒(méi)有一些注冊(cè)過(guò)的版本可供下載。這意味著 Pkg.add("FooBar")
在只安裝正式版本時(shí)并沒(méi)有工作。Pkg.clone("FooBar")
沒(méi)有一個(gè)指定的 URL 指向它。此外,當(dāng)他們運(yùn)行 Pkg.update()
,他們將會(huì)得到你上傳到倉(cāng)庫(kù)中最新版本的 FooBar
。當(dāng)你還在修改它,在它沒(méi)有成為正式版之前這是一個(gè)比較好的方式測(cè)試你的擴(kuò)展包。
當(dāng)你準(zhǔn)備好為你的擴(kuò)展包制作一個(gè)正式版本時(shí),你可以使用 Pkg.tag
命令為它添加版本號(hào)并注冊(cè):
julia> Pkg.tag("FooBar")
INFO: Tagging FooBar v0.0.1
INFO: Committing METADATA for FooBar
這個(gè) v0.0.1
標(biāo)簽在 FooBar
倉(cāng)庫(kù)中:
$ cd ~/.julia/v0.3/FooBar && git tag
v0.0.1
它也可以為 FooBar
在你的本地 METADATA
倉(cāng)庫(kù)中創(chuàng)建一個(gè)新的版本入口:
$ cd ~/.julia/v0.3/FooBar && git show
commit de77ee4dc0689b12c5e8b574aef7f70e8b311b0e
Author: Stefan Karpinski <stefan@karpinski.org>
Date: Wed Oct 16 23:06:18 2013 -0400
Tag FooBar v0.0.1
diff --git a/FooBar/versions/0.0.1/sha1 b/FooBar/versions/0.0.1/sha1
new file mode 100644
index 0000000..c1cb1c1
--- /dev/null
+++ b/FooBar/versions/0.0.1/sha1
@@ -0,0 +1 @@
+84b8e266dae6de30ab9703150b3bf771ec7b6285
如果在你的擴(kuò)展包倉(cāng)庫(kù)中有一個(gè) REQUIRE
文件,它將會(huì)在你標(biāo)記版本時(shí)拷貝到 METADATA
中適當(dāng)?shù)奈恢谩U(kuò)展包開(kāi)發(fā)者們需要確定他們的擴(kuò)展包中的 REQUIRE
文件確實(shí)反應(yīng)他們擴(kuò)展包的需求,如果你使用 Pkg.tag
命令,這將自動(dòng)進(jìn)入你的正式版???Requirements Specification 來(lái)了解完整格式的 REQUIRE
。
Pkg.tag
命令有第二個(gè)可選參數(shù)是一個(gè)顯示的版本號(hào)對(duì)象如 v"0.0.1"
或者一個(gè)標(biāo)志 :patch
,:minor
或者 :major
。這會(huì)智能地添加你的擴(kuò)展包的補(bǔ)丁、副本或者主版本號(hào)。
正如使用 Pkg.register
,這些對(duì)于 METADATA
的修改不會(huì)對(duì)其它任何人可見(jiàn)直到這些修改被上傳。再一次使用 Pkg.publish()
命令行,它第一次使用的時(shí)候要確定每個(gè)獨(dú)立的擴(kuò)展包倉(cāng)庫(kù)已經(jīng)被標(biāo)記,如果它們沒(méi)有被標(biāo)記要提交它們,然后打開(kāi)一個(gè)到 METADATA
的拉取請(qǐng)求:
julia> Pkg.publish()
INFO: Validating METADATA
INFO: Pushing FooBar permanent tags: v0.0.1
INFO: Submitting METADATA changes
INFO: Forking JuliaLang/METADATA.jl to StefanKarpinski
INFO: Pushing changes as branch pull-request/3ef4f5c4
INFO: To create a pull-request open:
https://github.com/StefanKarpinski/METADATA.jl/compare/pull-request/3ef4f5c4
如果你需要修改一個(gè)已發(fā)布擴(kuò)展包版本的注冊(cè)需求,你只需要修改這個(gè)版本的 metadata 即可,這樣可以保持相同的提交散列值 – 散列值與一個(gè)版本永久相關(guān):
$ cd ~/.julia/v0.3/METADATA/FooBar/versions/0.0.1 && cat requires
julia 0.3-
$ vi requires
為了保持提交的散列值保持一致,需要檢驗(yàn)倉(cāng)庫(kù)中的 REQUIRE
文件的內(nèi)容是否與在 METADATA
中的在修改之后不匹配;這是不可避免的。
盡管當(dāng)你在 METADATA
中為之前版本的擴(kuò)展包修改了需求,你仍需要在當(dāng)前版本的擴(kuò)展包中修改 REQUIRE
文件。
在擴(kuò)展包中的 ~/.julia/v0.3/REQUIRE
文件, REQUIRE
文件,和 METADATA
包 requires
文件使用一個(gè)簡(jiǎn)單的基于行的格式來(lái)顯示需要安裝的擴(kuò)展包版本的范圍。包 REQUIRE
和 METADATA requires
文件也需要包括擴(kuò)展包兼容的 julia
的版本范圍。
這里是這些包如何被解析和解釋的。
#
號(hào)后的內(nèi)容被從行中剝離成為注釋。最簡(jiǎn)單的有可能的依賴關(guān)系是這一行只有擴(kuò)展包的名字:
Distributions
這個(gè)依賴將被任何版本的 Distributions
擴(kuò)展包滿足。這個(gè)擴(kuò)展包的名字可以緊隨零活更多升序版本號(hào)之后,指明可以接受的那個(gè)擴(kuò)展包的版本間隔。一個(gè)版本號(hào)開(kāi)始一個(gè)間距,下一個(gè)是這個(gè)間距的結(jié)束,然后下一個(gè)又是一個(gè)新的開(kāi)始,然后繼續(xù);如果出現(xiàn)了一個(gè)奇怪的版本號(hào),那么任意更高的版本都將兼容;如果給出了一個(gè)相同的版本號(hào),那么后一個(gè)是可以兼容的最高版本。舉個(gè)例子,這一行:
Distributions 0.1
0.1.0
及其之后的版本的 Distributions
都將被兼容。一個(gè)版本號(hào)以 -
作為后綴也允許任何相同前綴的發(fā)布版本兼容。例如:
Distributions 0.1-
兼容相同前綴的版本例如 0.1-dev
或 0.1-rc1
,或 0.1.0
及其之后的任何版本。
這個(gè)依賴條目:
Distributions 0.1 0.2.5
兼容從 0.1.0
起的任何版本,但是不包括 0.2.5
。
如果你想要表明任何 0.1.x
版本被兼容,你可以這樣寫(xiě):
Distributions 0.1 0.2-
如果你想要兼容在 0.2.7
之后的版本,你可以這樣寫(xiě):
Distributions 0.1 0.2- 0.2.7
如果一個(gè)依賴行以引導(dǎo)字符 @
開(kāi)始,這是一個(gè)系統(tǒng)依賴關(guān)系。如果你的系統(tǒng)匹配這些系統(tǒng)環(huán)境,依賴關(guān)系就會(huì)被包含,否則將被忽略。例如:
@osx Homebrew
將僅在操作系統(tǒng)是 OS X 時(shí)需要 Homebrew
擴(kuò)展包。當(dāng)前支持的系統(tǒng)環(huán)境包括:
@windows
@unix
@osx
@linux
@unix
環(huán)境適應(yīng)于所有的 UNIX 操作系統(tǒng),包括 OS X, Linux 和 FreeBSD。在引導(dǎo)字符 @
后添加 !
表示否定的操作系統(tǒng)。例子:
@!windows
@unix @!osx
第一個(gè)環(huán)境應(yīng)用于任何系統(tǒng)除了 Windows ,第二個(gè)環(huán)境應(yīng)用于任何 UNIX 系統(tǒng)除了 OS X。
運(yùn)行時(shí)檢查 Julia 的當(dāng)前版本可以應(yīng)用在內(nèi)置 VERSION
變量,這是一種 VersionNumber
。這些代碼偶爾是必要的用來(lái)跟蹤在發(fā)布的 Julia 版本之間的新功能或棄用的功能。運(yùn)行時(shí)檢查的例子:
VERSION < v"0.3-" #exclude all pre-release versions of 0.3
v"0.2-" <= VERSION < v"0.3-" #get all 0.2 versions, including pre-releases, up to the above
v"0.2" <= VERSION < v"0.3-" #To get only stable 0.2 versions (Note v"0.2" == v"0.2.0")
VERSION >= v"0.2.1" #get at least version 0.2.1
到 version number literals 查看跟過(guò)更完整的描述細(xì)節(jié)。
更多建議: