通常情況下,使用者希望在公司防火牆內設定 Maven/Ivy 代理儲存庫,並讓開發人員的 sbt 執行個體透過此代理解析 artifacts。讓我們詳細說明為此需要進行哪些確切的變更。
當組織內的許多開發人員嘗試解析 artifacts 時,就會出現這種情況。每個開發人員的機器都會連上網際網路並下載 artifact,無論團隊中的其他人是否已下載過。代理儲存庫為組織提供單一遠端下載點。除了控制和安全考量外,代理儲存庫對於提高整個團隊的速度而言至關重要。
市面上有很多不錯的代理儲存庫解決方案
安裝和組態好代理儲存庫後,就可以為您的需求組態 sbt 了。請閱讀底部的註記,了解 Ivy 儲存庫的代理問題。
sbt 需要在兩個位置進行組態才能使用代理儲存庫。第一個是 ~/.sbt/repositories
檔案,第二個是啟動器指令碼。
~/.sbt/repositories
repositories 檔案是啟動器的外部組態。組態檔案的確切語法詳述於 sbt 啟動器組態。
以下為組態範例
[repositories]
local
my-ivy-proxy-releases: http://repo.company.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
my-maven-proxy-releases: http://repo.company.com/maven-releases/
此範例組態為 sbt 組態了三個儲存庫。
第一個解析器是 local
,用於使使用 publishLocal
推送的 artifacts 可在其他 sbt 專案中看到。
第二個解析器是 my-ivy-proxy-releases
。此儲存庫用於從公司代理儲存庫解析 sbt *本身*,以及任何可能需要 sbt 外掛程式。請注意,Ivy 解析器模式很重要,請確保您的模式與顯示的模式相符,否則您可能無法解析 sbt 外掛程式。
最後一個解析器是 my-maven-proxy-releases
。此儲存庫是所有標準 Maven 儲存庫(包括 Maven Central)的代理。
此 repositories 檔案是使用代理儲存庫所需的全部內容。這些儲存庫將優先包含在任何 sbt 建置中,但是您可以新增一些額外的組態,以強制使用代理儲存庫,而不是其他組態。
如果您需要定義認證才能連線至您的代理儲存庫,請定義一個環境變數 SBT_CREDENTIALS
,該變數指向包含您認證的檔案
export SBT_CREDENTIALS="$HOME/.ivy2/.credentials"
具有以下檔案內容
realm=My Nexus Repository Manager
host=my.artifact.repo.net
user=admin
password=admin123
如果上述方法對您的系統無效,則另一種方法是透過以下方式明確提供開機認證
-Dsbt.boot.credentials="$HOME/.ivy2/.credentials"
以及直接將認證新增至您的建置檔案
credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")
sbt 啟動器支援兩個組態選項,允許使用代理儲存庫。第一個是 sbt.override.build.repos
設定,第二個是 sbt.repository.config
設定。
sbt.override.build.repos
此設定用於指定應忽略所有 sbt 專案新增的解析器,而應優先使用在 repositories
組態中組態的解析器。將此設定與正確組態的 ~/.sbt/repositories
檔案一起使用,可使您的建置僅使用您的代理儲存庫。
其指定方式如下
-Dsbt.override.build.repos=true
值預設為 false,且必須明確啟用。
sbt.repository.config
如果您由於使用者權限錯誤或為了開發人員的便利性而無法建立 ~/.sbt/repositories
檔案,您可以直接使用以下內容修改 sbt 啟動指令碼
-Dsbt.repository.config=<path-to-your-repo-file>
只有在使用者尚未擁有自己的預設儲存庫檔案時,才需要這樣做。
在為 sbt 設定代理儲存庫時,最常犯的錯誤是嘗試將 *maven* 和 *ivy* 儲存庫 *合併* 到 *相同* 的代理儲存庫中。雖然某些儲存庫管理器允許這樣做,但建議不要這樣做。
即使您的公司未使用 Ivy,sbt 也會使用自訂版面配置來處理其自身外掛程式的二進位相容性限制。為了確保正確解析這些限制,只需設定兩個虛擬/代理儲存庫,一個用於 Maven,另一個用於 Ivy。
以下為範例設定
注意:如果使用 Nexus 作為代理儲存庫,則對於您為上游儲存庫 https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases 建立的代理對應,將版面配置原則設定為「允許」非常重要。如果您不這樣做,Nexus 將不會將原始要求代理到此 URL,而會改為發出 HTTP 404,且相依性將無法解析。