1. 代理儲存庫

代理儲存庫 

通常情況下,使用者希望在公司防火牆內設定 Maven/Ivy 代理儲存庫,並讓開發人員的 sbt 執行個體透過此代理解析 artifacts。讓我們詳細說明為此需要進行哪些確切的變更。

概觀 

當組織內的許多開發人員嘗試解析 artifacts 時,就會出現這種情況。每個開發人員的機器都會連上網際網路並下載 artifact,無論團隊中的其他人是否已下載過。代理儲存庫為組織提供單一遠端下載點。除了控制和安全考量外,代理儲存庫對於提高整個團隊的速度而言至關重要。

image

市面上有很多不錯的代理儲存庫解決方案

安裝和組態好代理儲存庫後,就可以為您的需求組態 sbt 了。請閱讀底部的註記,了解 Ivy 儲存庫的代理問題。

sbt 組態 

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>

只有在使用者尚未擁有自己的預設儲存庫檔案時,才需要這樣做。

代理 Ivy 儲存庫 

在為 sbt 設定代理儲存庫時,最常犯的錯誤是嘗試將 *maven* 和 *ivy* 儲存庫 *合併* 到 *相同* 的代理儲存庫中。雖然某些儲存庫管理器允許這樣做,但建議不要這樣做。

即使您的公司未使用 Ivy,sbt 也會使用自訂版面配置來處理其自身外掛程式的二進位相容性限制。為了確保正確解析這些限制,只需設定兩個虛擬/代理儲存庫,一個用於 Maven,另一個用於 Ivy。

以下為範例設定

image

注意:如果使用 Nexus 作為代理儲存庫,則對於您為上游儲存庫 https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases 建立的代理對應,將版面配置原則設定為「允許」非常重要。如果您不這樣做,Nexus 將不會將原始要求代理到此 URL,而會改為發出 HTTP 404,且相依性將無法解析。