現在、Webからアーティファクトをプルするsbt(Scala)プロジェクトを持っています。アーティファクトをキャッシュする企業標準化されたNexusリポジトリに移行したいと考えています。 Nexusのドキュメントから、Mavenプロジェクトでそれを行う方法を理解しています。しかし、sbtは明らかに異なるアプローチを使用しています。 (Ivyが何らかの形で関与していることは理解していますが、Ivyを使用したことはなく、どのように機能するか理解していません。)
すべての依存関係に企業のNexusリポジトリシステムを使用するようにsbtや基盤となるIvyに指示するにはどうすればよいですか?ソースリポジトリの新しいクローンが自動的にプロキシを使用するように、何らかのプロジェクトレベルの構成ファイルを使用するように答えたいです。 (つまり、ドットディレクトリにあるユーザーごとの設定ファイルをいじくり回すことは現実的ではありません。)
ありがとう!
ステップ1: 詳細なトピック:プロキシリポジトリ の指示に従います。これを要約して以下に追加しました。
(Artifactoryを使用している場合は、この手順をスキップできます。)ivy-styleをプロキシするために、企業のMavenリポジトリに完全に分離 Mavenプロキシリポジトリ(またはグループ)を作成します。これら2つの重要なリポジトリなどのリポジトリ:
これが必要なのは、一部のリポジトリマネージャーは、混在しているIvyスタイルのリポジトリとMavenスタイルのリポジトリを処理できないためです。
ファイルrepositories
を作成し、メインの企業リポジトリと手順1で作成した追加のリポジトリの両方を以下に示す形式でリストします。
[repositories]
my-maven-proxy-releases: http://repo.example.com/maven-releases/
my-ivy-proxy-releases: http://repo.example.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
そのファイルをホームディレクトリ内の.sbt
ディレクトリに保存するか、sbtコマンドラインで指定します。
sbt -Dsbt.repository.config=<path-to-your-repo-file>
古いバージョンのsbtを使用している場合の朗報:少なくとも、sbt 0.12.0ランチャーjarでは、古いsbtバージョンのブートプロパティファイル必要な行(repository.config
に言及する行)を含めないでください。これらのファイルを編集して必要な行を追加し、sbt 0.12.0ランチャーjarに再パッケージしても、sbtのこれらのバージョンで動作します。 !これは、この機能がsbt自体ではなく、ランチャーに実装されているためです。また、sbt 0.12.0ランチャーは、sbtのすべてのバージョンを0.7に戻すことができると主張されています!
ステップ2:外部リポジトリーが使用されていないことを確認するには、リゾルバーからデフォルトのリポジトリーを削除します。これは、次の2つの方法のいずれかで実行できます。
-Dsbt.override.build.repos=true
を追加します。これにより、ファイルで指定したリポジトリが、sbtファイルで指定されたリポジトリを上書きします。ただし、これはsbt 0.12以降でのみ動作する可能性があります-まだ試していません。fullResolvers := Seq(
または)
の代わりに、ビルドファイルでresolvers ++=
企業Mavenリポジトリのリゾルバーresolvers :=
を使用しますつかいます。わかりました。sbtメーリングリストのMark Harrahの助けを借りて、うまくいく答えがあります。
私のビルドクラスは次のようになりました(その他のリポジトリもあります)。
import sbt._
//By extending DefaultWebProject, we get Jetty support
class OurApplication(info: ProjectInfo) extends DefaultWebProject(info) {
// This skips adding the default repositories and only uses the ones you added
// explicitly. --Mark Harrah
override def repositories = Set("OurNexus" at "http://our.nexus.server:9001/nexus/content/groups/public/")
override def ivyRepositories = Seq(Resolver.defaultLocal(None)) ++ repositories
/* Squeryl */
val squeryl = "org.squeryl" % "squeryl_2.8.0.RC3" % "0.9.4beta5"
/* DATE4J */
val date4j = "hirondelle.date4j" % "date4j" % "1.0" from "http://www.date4j.net/date4j.jar"
// etc
}
今、マシンの.ivy2/cache
ディレクトリからSquerylツリーを削除すると、sbtは適切なURLでNexusツリーからそれを取得しようとします。問題が解決しました!
必要なのは、プロパティファイルsbt.boot.properties
を定義することです。
C:\ HOMEWARE\apps\sbt-0.74\sbt.boot.properties [scala] バージョン:2.7.7 #分類子:ソース、javadoc [アプリ] 組織:org.scala-tools.sbt 名前:sbt バージョン:read(sbt .version) クラス:sbt.xMain コンポーネント:xsbti クロスバージョン:true 分類子:ソース、javadoc [リポジトリ] local my-nexus:http://my.nexus/nexus/content/repositories/scala-tools/、[organization]/[module]/[revision]/ [type] s/[artifact](-[classifier])。[ext] maven-local #sbt-db:http://databinder.net/repo/、[organization]/[モジュール]/[リビジョン]/[タイプ] s/[アーティファクト](-[分類子])。[ext] #maven-central #scala-tools-releases #scala-tools-snapshots [boot] ディレクトリ:project/boot プロパティ:project/build.properties プロンプト作成:プロジェクトが存在しないため、新しいプロジェクトを作成しますか? プロンプト入力:true クイックオプション:true [ログ] レベル:debug [app-properties] project.name:quick = set(test)、new = Prompt(Name)[p]、fill = Prompt(Name ) project.organization:new = Prompt(Organization)[org.vonc] project.version:quick = set(1.0)、new = Prompt(Version)[1.0]、fill = Prompt (バージョン)[1.0] build.scala.versions:quick = set(2.8.0.RC2)、new = Prompt(Scala version)[2.8.0.RC2]、fill = Prompt(Scala version) [2.8.0.RC2] sbt.version:quick = set(0.7.4)、new = Prompt(sbt version)[0.7.4]、fill = Prompt(sbt version)[0.7.4] project.scratch:quick = set(true) project.initialize:quick = set(true)、new = set(true) [ivy] cache-directory:C:\ HOMEWARE\projects\.ivy2\cache
注:このsbt.boot.properties
ファイルは、以下からインスピレーションを受けています。
sbt-0.74
自体の中にあるもの!任意のexternalMavenリポジトリ定義にコメントし、独自のNexus Mavenリポジトリへの参照を追加しました。
ランチャーは、優先順位の高い順に次のいずれかの方法で構成できます。
jar
の/sbt/sbt.boot.properties
ファイルを置き換えます。sbt.boot.properties
という名前の構成ファイルをクラスパスに配置します。/sbt
プレフィックスなしでクラスパスルートに配置します。- コマンドラインで代替構成の場所を指定します。これは次の方法で実行できます。
- システムプロパティとして場所を指定する
sbt.boot.properties
- または、先頭に「
@
」が付いたランチャーへの最初の引数として。システムプロパティの優先順位は低くなっています。
相対パスの解像度は次のとおりです。
- 現在の作業ディレクトリに対して最初に試行された、
- 次に、ユーザーのホームディレクトリに対して、
- そして、ランチャーjarを含むディレクトリに対して。
これらの試行がいずれも成功しない場合、エラーが生成されます。
Sbt.batラッパーを定義します(必ずyoursbt.boot.properties
)を指定するには:
C:\HOMEWARE>more C:\HOMEWARE\bin\sbt.BAT
@echo off
set t=%~dp0
set adp0=%t:C:\="%"
set SBT_DIR=%adp0%..\apps\sbt-0.74
dir C:\%SBT_DIR%\sbt-launch-0.7.4.jar
# if needed, add your proxy settings
set PROXY_OPTIONS=-Dhttp.proxyHost=my.proxy -Dhttp.proxyPort=80xx -Dhttp.proxyUser=auser -Dhttp.proxyPassword=yyyy
set Java_OPTIONS=-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -cp C:\HOMEWARE\apps\sbt-0.74\sbt-launch-0.7.4
set SBT_BOOT_PROPERTIES=-Dsbt.boot.properties="sbt.boot.properties"
cmd /C C:\HOMEWARE\apps\jdk4Eclipse\bin\Java.exe %PROXY_OPTIONS% %Java_OPTIONS% %SBT_BOOT_PROPERTIES% -jar C:\HOMEWARE\apps\sbt-0.74\sbt-launch-0.7.4.jar %*
そして、sbtは以下からアーティファクトonlyをダウンロードします:
自宅で実行していた古いNexusオープンソース1.6でテストしたところ、Java 1.6、sbt07.4
C:\Prog\Java\jdk1.6.0_18\jre\bin\Java -Xmx512M -Dsbt.boot.properties=sbt.boot.properties - jar "c:\Prog\Scala\sbt\sbt-launch-0.7.4.jar"
それは与える:
[success] Build completed successfully.
C:\Prog\Scala\tests\pp>sbt
Getting Scala 2.8.0 ...
downloading http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.8.0/scala-compiler-2.
8.0.jar ...
[SUCCESSFUL ] org.scala-lang#scala-compiler;2.8.0!scala-compiler.jar (311ms)
downloading http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-library/2.8.0/scala-library-2.8.
0.jar ...
[SUCCESSFUL ] org.scala-lang#scala-library;2.8.0!scala-library.jar (185ms)
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
2 artifacts copied, 0 already retrieved (14484kB/167ms)
[info] Building project test 0.1 against Scala 2.8.0
[info] using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7
Sbt.boot.propertiesファイルで面白い値を試してみると:
C:\Prog\Scala\tests\pp>sbt
Getting Scala 2.9.7 ...
:: problems summary ::
:::: WARNINGS
module not found: org.scala-lang#scala-compiler;2.9.7
==== nexus: tried
http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.9.7/scala-compiler-2.9.7.pom
-- artifact org.scala-lang#scala-compiler;2.9.7!scala-compiler.jar:
http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.9.7/scala-compiler-2.9.7.jar
したがって、定義した2つのリポジトリに限定されます。
[repositories]
nexus: http://localhost:8081/nexus/content/repositories/scala
nexus2: http://localhost:8081/nexus/content/repositories/scala, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]
(他のすべてにコメントしました:local
、maven-local
、...)
リポジトリにコメントallし、sbt.boot.properties
のscalaバージョンに面白い値(2.7.9)を入力すると、 get(OPがしたように)
C:\Prog\Scala\tests\pp>sbt
Error during sbt execution: No repositories defined.
2.7.7を(allリポジトリにコメントを付けたまま)入れた場合、はい、エラーは生成されません:
C:\Prog\Scala\tests\pp>sbt
[info] Building project test 0.1 against Scala 2.8.0
[info] using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7
しかし、それは、前回の試行中に既にscala2.8.0をダウンロードしていたからです。
そのライブラリをproject/boot
ディレクトリから削除すると、例外がスローされます。
[info] using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7
> C:\Prog\Scala\tests\pp>sbt
Error during sbt execution: No repositories defined.
at xsbt.boot.Pre$.error(Pre.scala:18)
at xsbt.boot.Update.addResolvers(Update.scala:197)
...
at xsbt.boot.Boot$.main(Boot.scala:15)
at xsbt.boot.Boot.main(Boot.scala)
Error loading project: Error during sbt execution: No repositories defined.
sbt_home/conf "sbtconfig.txt"の設定ファイルを編集します
2行追加
-Dsbt.override.build.repos=true
-Dsbt.repository.config="C:/Program Files (x86)/sbt/conf/repo.properties"
repo.propertiesのコンテンツは
[repositories]
local
public: http://222.vvfox.com/public <-fix this ,write your local nexus group url
まあこれはしばらくの間私を悩ませてきたので、githubでMaven用のSBTプラグインを書いた男を見つけました maven-sbt プロジェクトとmaven.MavenDependenciesのミックスイン、およびupdateやlocal-publishなどのすべての操作は、ローカルのmavenと連携します。それについての素晴らしいところは、あなたが私のようであるならば、あなたの組織はすべてMavenです。したがって、すべてのライブラリはローカルのMavenリポジトリにありますが、何らかの理由で最初にsbtを使用してビルドすると、ivyの束またはjarも取得し始めます。 Mavenビルド用にそれらを取得する必要があるため、スペースと時間の無駄です。
そうは言っても、これがsbtに組み込まれればいいので、すべてのプロジェクトに追加する必要はありません。少なくともプロセッサーとして。彼は、私が読んだことの1つで、0.9に追加したいと述べましたが、見つけることができませんでした。
~/.sbt/repositories
に空のファイルがあったため、このエラーが発生しました。リポジトリをファイルに追加し、ファイルを削除することで問題は解決しました。