シェルからsbtアプリを実行して、アプリを通常のコマンドラインプログラムとして実行できるようにするにはどうすればよいですか(scala
を介して直接実行するかのように、巨大なクラスパスを設定する必要はありません)。
私は私ができることを知っています:
echo hello | sbt 'run-main com.foo.MyMain3 arg1 arg2' > out.txt
ただし、これは(1)sbtを開始するため、開始に永遠にかかります。(2)すべてのstdoutとstderrがstdoutに移動し、(3)すべての出力がロガー[情報]または[エラー]で装飾されます。
https://github.com/harrah/xsbt/wiki/Launcher を見ましたが、依存関係をダウンロードして新しい環境などをセットアップするため、重すぎるようです。このアプリを既存の開発環境内で実行したいだけです。
これまでのところ、クラスパスを構築するために独自のスクリプトをまとめました。また、 sbtが生のクラスパスを出力するようにプロジェクトファイルを変更する のような他のこともできますが、そこにいるような気がします。より良い方法でなければなりません。
start-script SBTプラグイン は次の場所にあります:
https://github.com/sbt/sbt-start-script
OS Xで動作しないスクリプトを設定して生成するには、いくつかの手順が必要ですが、そのプラットフォームを使用している場合は簡単に修正できます(以下を参照)。
Greadlinkをインストールします(OS Xのみ):
a)brew install coreutils
b)readlinkを新しい関数にマップします(greadlink)これらの行を〜/ .bashrcに追加します:
function readlink(){greadlink "$ @"; }
export -f readlink`
Start-scriptプラグインを〜/ .sbt/plugins /build.sbtに追加します。
addSbtPlugin( "com.typesafe.sbt"% "sbt-start-script"% "0.8.0")
現在のプロジェクトにstart-scriptタスクを追加します。
$ sbt add-start-script-tasks
#build.sbtが存在するディレクトリから実行
現在のbuild.sbtにstart-scriptサポートを追加します。
com.typesafe.sbt.SbtStartScriptをインポートします
seq(SbtStartScript.startScriptForClassesSettings:_ *)
ステートメント間の空白行に注意してください(SBTビルドファイルのデリゲール)。
次に、sbt run-main
のようなアプリを起動するスクリプトを作成するが、sbtを使用しない場合は、次のコマンドを実行します。
$ sbt start-script
target/start mypackage.MyMainClass
これが私のSBT(バージョン0.10)プロジェクト定義にあるものです。
val Mklauncher = config("mklauncher") extend(Compile)
val mklauncher = TaskKey[Unit]("mklauncher")
val mklauncherTask = mklauncher <<= (target, fullClasspath in Runtime) map { (target, cp) =>
def writeFile(file: File, str: String) {
val writer = new PrintWriter(file)
writer.println(str)
writer.close()
}
val cpString = cp.map(_.data).mkString(":")
val launchString = """
CLASSPATH="%s"
scala -usejavacp -Djava.class.path="${CLASSPATH}" "$@"
""".format(cpString)
val targetFile = (target / "scala-sbt").asFile
writeFile(targetFile, launchString)
targetFile.setExecutable(true)
}
... // remember to add mklauncherTask to Project Settings
mklauncher
タスクはスクリプトを作成しますtarget/scala-sbt
は、プロジェクトのクラスパスがすでに設定されている状態でscala
を実行します。クラスパスが変更されるたびにmklauncher
が自動的に実行されると便利ですが、これについてはまだ検討していません。
(埋め込みインタープリターの作成を容易にするために、ScalaではなくJavaクラスパスを使用します。)
Sbt開始スクリプトプラグインを発見しました: https://github.com/typesafehub/xsbt-start-script-plugin :
このプラグインを使用すると、プロジェクトのスクリプトターゲット/開始を生成できます。スクリプトはプロジェクトを「インプレース」で実行します(最初にパッケージをビルドする必要はありません)。
ターゲット/開始スクリプトはsbtrunに似ていますが、SBTに依存していません。 sbt runは、SBT自体をメモリ内に保持するため、本番環境での使用はお勧めしません。 target/startは、本番環境でアプリを実行することを目的としています。
プラグインは、target/startを生成するタスクstart-scriptを追加します。また、start-scriptタスクのエイリアスであるステージタスクも追加します。