17

Python では、でパッケージをインストールすると、ファイル システムの現在のディレクトリに関係なく、pip install package_name入力して Python repl を開き、その名前でパッケージをインポートするだけです。python

そのようです

$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> 

ライブラリがインポートされ、requestsreplで再生できます。

Scalaでは、を使用するプロジェクトでこれを行う方法を知っていますが、学習目的で、コマンドラインで入力するだけでインストールされたパッケージをインポートsbtできるようにパッケージをインストールしたいと思います。scala特定のプロジェクトに関連付けられています。

$ scala
Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_40).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scalaz._
<console>:7: error: not found: value scalaz
       import scalaz._

これどうやってするの?

4

3 に答える 3

14

Scala は Python とは異なります。Scala 2.9.x 用にコンパイルされたコードは、2.10.x と互換性がありません。そのため、異なるバージョンで作業する場合、グローバル定義は多くの問題を引き起こす可能性があります。

SBTを使用して $HOME/.sbt/plugins/build.sbt に追加できます

libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.0.4"

また

libraryDependencies += "org.scalaz" % "scalaz-core_2.10" % "7.0.4"

/tmp に移動し、SBT で Scala REPL を開始します。

sbt console

しかし、長期的には、それは良い考えではありません。

最善の方法は、SBT をインストールし、ファイル build.sbt を作成して、これをその中に入れることです。

libraryDependencies += "org.scalaz" % "scalaz-core_2.10" % "7.0.4"

scalaVersion := "2.10.2" 

initialCommands in console := "import scalaz._, Scalaz._"

コンソールでbuild.sbtのフォルダーに移動して実行します

sbt console

これにより、REPL を試すことができ、すでに scalaz をインポートしてクラスパスに入れることができます。さらに、追加の依存関係を簡単に追加できます。SBT はクールです。新しい Scala バージョンを手動でインストールする必要はなく、build.sbt で宣言するだけです。

于 2013-10-18T12:29:33.323 に答える
1

ほとんどの jar ライブラリはプログラマー プロジェクトと一緒に使用することを意図しているため、これは通常はお勧めしません。ivyまた、他のエコシステムとは異なり、jar ライブラリは通常、またはmavenまたは などのユーザー モード ライブラリ管理ツールを介してインストールさsbtれます。

本当にこれを行いたい場合は、jar を scala のTOOL_CLASSPATH場所から見つけるか、scala.batまたはscalascala ディストリビューションにバンドルされているシェル スクリプト ファイルにインストールできます。または、独自のカスタム scala repl を構築して、構成された場所からグローバルにインストール可能なライブラリをロードすることもできます。いずれにせよ、それはTOOL_CLASSPATH.

PS: 現在、これを支援するための実際のscala.batファイルにアクセスすることはできませんが、ここここで調べて、私の言いたいことを理解してください。これらのファイルは、.bat ファイルがディストリビューションのものとはどのように構成されているかを示していない可能性があることに注意してください (かなり古い可能性があります)。情報については、公式ディストリビューションで調べてください。

編集

戻ってきて、公式ディストリビューションに含まれている実際のscala バッチとシェル スクリプトを見たので、もう少し説明できます:-)

上で述べたように、scalaスクリプトTOOL_CLASSPATHは、通常は${SCALA_HOME}/lib. TOOL_CLASSPATHまた、有望なオプションで追加する機能も提供し-toolcpます-それが何を示すか見てみましょう:(バッチスクリプトは似ています-scalaシェルスクリプトからのものを示します)

while [[ $# -gt 0 ]]; do
  case "$1" in
    -D*)
      # pass to scala as well: otherwise we lose it sometimes when we
      # need it, e.g. communicating with a server compiler.
      java_args=("${java_args[@]}" "$1")
      scala_args=("${scala_args[@]}" "$1")
      shift
      ;;
    -J*)
      # as with -D, pass to scala even though it will almost
      # never be used.
      java_args=("${java_args[@]}" "${1:2}")
      scala_args=("${scala_args[@]}" "$1")
      shift
      ;;
    -toolcp)
      TOOL_CLASSPATH="${TOOL_CLASSPATH}${SEP}${2}"
      shift 2
      ;;
    -nobootcp)
      unset usebootcp
      shift
      ;;
    -usebootcp)
      usebootcp="true"
      shift
      ;;
    -debug)
      SCALA_RUNNER_DEBUG=1
      shift
      ;;
    *)
      scala_args=("${scala_args[@]}" "$1")
      shift
      ;;
  esac
done

ご覧のとおり、これは非常に制限的です。追加するjar を指定する必要があります。あなたはただ使うことができます-cp!改善できますか?確かに、私たちはこのtoolcpビジネスをいじる必要があります。

addtoToolCP() {
    for i in $(find $1 -name "*.jar")
    do
        if [[ -z "$TOOLCP" ]]
        then
            TOOLCP="$i"
        else
            TOOLCP="${TOOLCP}:$i"
        fi
    done
}

TOOLCPそのため、パラメータが空であることを確認し、それに応じて空でないかのように呼び出すことができscalaますscala -toolcp $TOOLCP。これで、シェル スクリプトを次のように呼び出すことができますmyscalascript <list-of-paths-to-be-added-to-toolcp>。または、1 つのフォルダーだけを保持して、そのフォルダーに新しいライブラリを追加し続けることもできます。これが役立つことを願っています-他の人が言っているように、バイナリ互換性の問題に気をつけてください. バイナリの非互換性の問題は、scala のメジャー バージョンにのみ影響し、マイナー バージョンは完全に互換性があるはずです。最後に、自分自身を死ぬまで繰り返す危険があるため、これが確実に必要な場合にのみ使用してください。:-)

于 2013-10-18T10:24:46.807 に答える