將套件發佈到 Hex 包括註冊 Hex 使用者、將元資料新增至專案的 mix.exs
檔案,最後利用 mix
任務提交套件。
註冊使用者時,系統會提示您輸入使用者名稱、電子郵件和密碼。電子郵件用於註冊期間確認您的身分,以及在您的一個套件發生問題時與您聯絡。電子郵件絕不會與第三方共用。
$ mix hex.user register
Username: johndoe
Email: john.doe@example.com
Password:
Password (confirm):
Registering...
Generating API key...
You are required to confirm your email to access your account, a confirmation email has been sent to john.doe@example.com
完成此步驟後,請查看您的電子郵件信箱中的確認電子郵件。在您追蹤連結後,您的帳戶即可使用。
在發布之前,您必須選擇套件名稱。請記住,發布到 Hex 的套件是公開的,且社群中的任何人都可以存取。社群也負責選擇並鼓勵使用良好的套件名稱。以下提供一些提示
plug_auth
(或 plug_somename
),而非 auth
(或 somename
)。Plug
命名空間,如果你有 Plug 的驗證套件,請使用 PlugAuth
,而非 Plug.Auth
。plug_auth
,則你所有模組(除了 mix 任務等特殊模組之外)都應以 PlugAuth.
開頭(例如 PlugAuth.Utils
、PlugAuth.User
)。此舉很重要,因為在一個 BEAM 系統中,只能有一個具有指定名稱的模組在執行,如果多個套件定義了相同模組,則你無法同時使用這兩個套件,因為只會使用模組的一個版本。擁有名稱後,就可以將適當的元資料新增到你的 mix.exs
檔案中。
mix.exs
套件是在專案的 mix.exs
檔案中,使用 project
函數進行設定。請參閱下方的範例檔案。
首先,請確認 :version
屬性正確無誤。所有 Hex 套件都必須遵循 語意化版本控制。當你的套件版本處於主版本 “0” 時,任何重大變更都應透過增加次要版本來表示。例如,0.1.0 -> 0.2.0
。
填寫 :description
屬性。它可以是一或數個句子,用來描述套件。
在 :package
屬性下方有一些額外的設定選項
:name
:organization
"hexpm"
儲存庫。:licenses
:links
:files
:build_tools
rebar
或 rebar.config
檔案,Hex 將標示為可以使用 rebar 建置。可以透過設定此欄位來覆寫此偵測。為了改善 ExDoc 生成的文件,以下欄位也可以作為 project
函式的部份提供
:source_url
:homepage_url
參閱 ExDoc 文件 以取得改善產製文件的更多資訊。
未定義版本控制(:git
或 :path
)的相依性將自動視為 Hex 的相依性。如需更多詳細資料,請參閱 使用指南。
只有 Hex 套件可以使用做為套件的相依性。無法上傳具有 Git 相依性的套件。另外,只會包括製作相依性,就像 Mix 只會在提取相依性的相依性時提取製作相依性一樣。當相依性未定義 :only
屬性,或定義為 only: :prod
時,相依性將視為製作相依性。
文件說明會在您發布套件時自動發布到 hexdocs.pm。如果您只想發布套件本身,則您可以執行 mix hex.publish package
,與之類似,如果您想要(重新)發布現有套件版本的說明文件,則您可以執行 mix hex.publish docs
。
在發布說明文件之前,Hex 會執行 mix docs
任務,以建立說明文件並確保其是最新的。Elixir 的主要說明文件工具 ex_doc
提供了此任務,因此如果您將其新增為相依項,則您在發布套件時無需做任何事即可自動建立說明文件。查看 ex_doc 的說明文件,以了解如何設定說明文件,我們建議在將說明文件發布到 Hex 之前,使用 mix docs
在本地建立說明文件。最後,請務必查看 Elixir 的說明文件撰寫指南 以取得建議和最佳實務。
如果您想使用其他說明文件工具或處理來自 ex_doc 建立的後處理,則可以別名化 docs
任務,請查看 任務別名 docs 以取得更多資訊。建立的說明文件應放在 doc/
目錄中,至少包含一個 index.html
檔案。
defmodule Postgrex.MixProject do
use Mix.Project
def project() do
[
app: :postgrex,
version: "0.1.0",
elixir: "~> 1.0",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
description: description(),
package: package(),
deps: deps(),
name: "Postgrex",
source_url: "https://github.com/elixir-ecto/postgrex"
]
end
def application() do
[]
end
defp deps() do
[
{:decimal, "~> 1.0"},
{:ex_doc, "~> 0.14", only: :dev, runtime: false}
]
end
defp description() do
"A few sentences (a paragraph) describing the project."
end
defp package() do
[
# This option is only needed when you don't want to use the OTP application name
name: "postgrex",
# These are the default files included in the package
files: ~w(lib priv .formatter.exs mix.exs README* readme* LICENSE*
license* CHANGELOG* changelog* src),
licenses: ["Apache-2.0"],
links: %{"GitHub" => "https://github.com/elixir-ecto/postgrex"}
]
end
end
套件的概資料與依賴關係加入到 mix.exs
後,就可以使用 mix hex.publish
指令發布套件
$ mix hex.publish
Publishing postgrex v0.4.0
Dependencies:
decimal ~> 0.1.0
Excluded dependencies (not part of the Hex package):
ex_doc
Included files:
lib/postgrex
lib/postgrex/binary_utils.ex
lib/postgrex/connection.ex
lib/postgrex/protocol.ex
lib/postgrex/records.ex
lib/postgrex/types.ex
mix.exs
Proceed? [Yn] Y
Published postgrex v0.4.0
恭喜你,你的套件已發布!它會顯示在 hex.pm 網站中,而且可以新增為其他 Mix 專案中的依賴關係。
在發布後,請透過新增它為 Mix 專案中的依賴關係並擷取與編譯它來測試你的套件。如果有任何問題,你可以在第一次發布後的一個小時內,再次發布套件。也可以使用 mix hex.publish --revert VERSION
來回復發布。
在執行發布套件的指令時,Hex 會針對在 :files
屬性中所列的所有檔案與目錄建立一個 tar 檔。將 tarball 發佈到 Hex 伺服器後,會上傳到內容傳遞網路 (CDN) 中,以提供使用者快速且穩定的存取。Hex 也會重新編譯所有用戶端在擷取依賴關係時會自動更新的登錄檔。
你可以自動化透過 CI 等工具來發布套件。你需要一把具有發布套件權限的密鑰
$ mix hex.user key generate --key-name publish-ci --permission api:write
Username:
Account password:
Generating key...
f48ac236bca15c3271e077c15c5320c4
如果你要發布一個屬於你的組織的套件,建議使用組織的密鑰,而不是個人的密鑰
$ mix hex.organization key acme generate --key-name publish-ci --permission api:write
Local password:
f48ac236bca15c3271e077c15c5320c4
在 HEX_API_KEY
系統環境變數中設定密鑰。在不用提示的情況下發布套件,傳遞 --yes
旗標
$ HEX_API_KEY=f48ac236bca15c3271e077c15c5320c4 mix hex.publish --yes
請注意,在自動化發布時應小心使用,因為 Hex 會輸出重要的警告,甚至建議如何改善您的套件,這些建議在自動化的過程中很容易被忽略。另外請注意,Hex 仍未達到 1.0 版,因此各次版本之間可能會發生重大變更,而 CI 通常會安裝最新版本。