web-dev-qa-db-ja.com

通常のコマンドラインプログラムとしてシェルからsbtメインクラスを実行するにはどうすればよいですか?

シェルから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が生のクラスパスを出力するようにプロジェクトファイルを変更する のような他のこともできますが、そこにいるような気がします。より良い方法でなければなりません。

26
Yang

start-script SBTプラグイン は次の場所にあります:

https://github.com/sbt/sbt-start-script

OS Xで動作しないスクリプトを設定して生成するには、いくつかの手順が必要ですが、そのプラットフォームを使用している場合は簡単に修正できます(以下を参照)。

セットアップ

  1. Greadlinkをインストールします(OS Xのみ):

    a)brew install coreutils

    b)readlinkを新しい関数にマップします(greadlink)これらの行を〜/ .bashrcに追加します:

    function readlink(){greadlink "$ @"; }

    export -f readlink`

  2. Start-scriptプラグインを〜/ .sbt/plugins /build.sbtに追加します。

    addSbtPlugin( "com.typesafe.sbt"% "sbt-start-script"% "0.8.0")

  3. 現在のプロジェクトにstart-scriptタスクを追加します。

    $ sbt add-start-script-tasks#build.sbtが存在するディレクトリから実行

  4. 現在のbuild.sbtにstart-scriptサポートを追加します。

    com.typesafe.sbt.SbtStartScriptをインポートします

    seq(SbtStartScript.startScriptForClassesSettings:_ *)

ステートメント間の空白行に注意してください(SBTビルドファイルのデリゲール)。

開始スクリプトの生成

次に、sbt run-mainのようなアプリを起動するスクリプトを作成するが、sbtを使用しない場合は、次のコマンドを実行します。

$ sbt start-script

実行

target/start mypackage.MyMainClass
10
Brent Faust

これが私の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クラスパスを使用します。)

17
Kipton Barros

Sbt開始スクリプトプラグインを発見しました: https://github.com/typesafehub/xsbt-start-script-plugin

このプラグインを使用すると、プロジェクトのスクリプトターゲット/開始を生成できます。スクリプトはプロジェクトを「インプレース」で実行します(最初にパッケージをビルドする必要はありません)。

ターゲット/開始スクリプトはsbtrunに似ていますが、SBTに依存していません。 sbt runは、SBT自体をメモリ内に保持するため、本番環境での使用はお勧めしません。 target/startは、本番環境でアプリを実行することを目的としています。

プラグインは、target/startを生成するタスクstart-scriptを追加します。また、start-scriptタスクのエイリアスであるステージタスクも追加します。

2
Yang