0

ブートストラップを使用する play 2.0.2 (scala) プロジェクトがあります。ブートストラップを git サブモジュールとして追加したので、個々のファイルをコピーしなくてもバージョンを簡単に変更できます。

私のプロジェクト構造は次のようになります。

project
  |_ bootstrap
  |    \_ img
  |    \_ js
  |    \_ less
  |         \_ bootstrap.less
  |         \_ responsive.less
  |_ app
       \_ assets
            \_ css
                \_ my.less

私の Build.scala には次のものがあります。

def customLessEntryPoints(base: File): PathFinder = (
    (base / "app" / "assets" / "css" * "*.less") +++
    (base / "bootstrap" / "less" / "bootstrap.less") +++
    (base / "bootstrap" / "less" / "responsive.less")
)

def externalAssets(base: File): PathFinder = (base / "bootstrap")
val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
  playAssetsDirectories <+= baseDirectory / "bootstrap",
  playExternalAssets <+= baseDirectory.apply(file => (file, externalAssets(_), "bootstrap")),
  lessEntryPoints <<= baseDirectory(customLessEntryPoints)
  // other settings
)

「~ run」を実行した後に Web アプリケーションにアクセスすると (または play-copy-assets を実行すると)、次のようになります。

[error] {file:/<path_to_project>/}<project>/*:play-copy-assets: No mapping for <path_to_project>\bootstrap\less\bootstrap.less
[error] application -

! Internal server error, for request [GET /] ->

play.api.UnexpectedException: Unexpected exception [RuntimeException: No mapping for <path_to_project>\bootstrap\less\bootstrap.less]
    at sbt.PlayReloader$$anon$2$$anonfun$reload$3$$anonfun$4$$anonfun$apply$12.apply(PlayReloader.scala:233) ~[na:na]
    at sbt.PlayReloader$$anon$2$$anonfun$reload$3$$anonfun$4$$anonfun$apply$12.apply(PlayReloader.scala:226) ~[na:na]
    at scala.Option.map(Option.scala:133) ~[scala-library.jar:0.11.3]
    at sbt.PlayReloader$$anon$2$$anonfun$reload$3$$anonfun$4.apply(PlayReloader.scala:226) ~[na:na]
    at sbt.PlayReloader$$anon$2$$anonfun$reload$3$$anonfun$4.apply(PlayReloader.scala:224) ~[na:na]
    at scala.Either$LeftProjection.map(Either.scala:183) ~[scala-library.jar:0.11.3]
java.lang.RuntimeException: No mapping for <path_to_project>\bootstrap\less\bootstrap.less
    at scala.sys.package$.error(package.scala:27) ~[scala-library.jar:na]
    at scala.Predef$.error(Predef.scala:66) ~[scala-library.jar:0.11.3]
    at sbt.Mapper$$anonfun$fail$1.apply(PathMapper.scala:26) ~[na:na]
    at sbt.Mapper$$anonfun$fail$1.apply(PathMapper.scala:26) ~[na:na]
    at sbt.Alternatives$$anon$1$$anonfun$$bar$1$$anonfun$apply$3.apply(PathMapper.scala:61) ~[na:na]
    at sbt.Alternatives$$anon$1$$anonfun$$bar$1$$anonfun$apply$3.apply(PathMapper.scala:61) ~[na:na]

ブートストラップの img および js サブフォルダーをアセットとして (パブリックの静的なものと一緒に、または別のパスで) 提供し、bootstrap|responsive.less ファイルを css にコンパイルして同様に提供したいと考えています。

カスタム エントリ ポイントは正常に機能します。つまり、それらがすべて /app の下にあるように変更し、そこにブートストラップから少ないファイルを移動すると、機能します。画像とjsファイルをパブリックに移動すると、それも機能します。しかし、私が達成しようとしているのは、きれいな分離です。

playAssetsDirectories と playExternalAssets の使用方法を正しく理解していないことは確かです。これらの設定について多くのバリエーションを試しました。私がしようとしていることが可能かどうか、または設定がどのように関連する必要があるかはわかりません-たとえば、lessEntryPoint はアセット ディレクトリにある必要がありますか? また、externalAssets はアセット ディレクトリと見なされますか? 誰かが私が間違っているところを指摘できますか? 前もって感謝します。

4

2 に答える 2

2

きれいに分離しようとしている場合は、内部コンパイラを無効にして、Crunch などの外部ツールを使用することをお勧めします。

そうでない場合は、Play が SINGLE ファイル (my.less) を使用するように制限し、そこから他のすべてのファイルを含めることができます。public ディレクトリから内部コンパイラを使用して LESS ファイルをコンパイルすることはできません。これらは静的アセットのみです。Play がそれらにアクセスできるようにするには、app/stylesheet の下に配置する必要があります。

また、サブディレクトリにあるファイルをコンパイルしようとすると、LESS 1.3 にはいくつかの重大な問題があることにも注意してください -- これは play-framework メーリング リストの複数の人々を悩ませており、特に Bootstrap はエラーで爆発することが知られています。

于 2012-08-28T05:45:18.033 に答える
1

次のように、BootstrapLESSをプロジェクトに適用しました。

アセットディレクトリにブートストラップ「インポート」ファイルを用意します。Playはそれらをコンパイルします。

app\assets\bootstrap.less
app\assets\responsive.less

他の「.less」ファイルを例に入れますapp\less

app\lessパスがディレクトリを参照しているbootstrap.lessファイルを編集します

@import "../less/reset.less";

物理的にコンパイルされたCSSは

\target\scala-2.9.1\resource_managed\main\public

しかし、あなたは彼らが公の場にいるのと同じようにそれらを参照することができます

<link rel="stylesheet" media="screen" href="@routes.Assets.at("bootstrap.css")">
于 2012-08-28T10:58:53.033 に答える