Play Framework:如何在/app之外配置可编译[LESS]资产



我有一个使用bootstrap的play 2.0.2(scala)项目。我添加了bootstrap作为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应用程序时,(或者如果我运行播放复制资产)我得到:

[error] {file:/<path_to_project>/}<project>/*:play-copy-assets: No mapping for <path_to_project>bootstraplessbootstrap.less
[error] application -
! Internal server error, for request [GET /] ->
play.api.UnexpectedException: Unexpected exception [RuntimeException: No mapping for <path_to_project>bootstraplessbootstrap.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>bootstraplessbootstrap.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]

我希望bootstrap的img和js子文件夹作为资产(与公共中的静态子文件夹并排或以不同的路径),并将bootstrap|responsive.less文件编译成css并提供。

自定义入口点工作良好。也就是说,如果我更改它们,使它们都在/app下,并将引导程序中的较少文件移到那里,它们就会工作。如果我将图像和js文件移到public下,也可以。但我正在努力实现的是彻底的分离。

我确信我还没有正确理解如何使用playAssetsDirectories和playExternalAssets,我已经尝试了许多不同的设置。我不确定我所尝试的是否可能,也不确定设置应该如何关联——例如,lessEntryPoint必须在资产目录中吗?externalAssets是否被视为资产目录?有人能指出我哪里错了吗?提前谢谢。

如果您正在尝试干净的分离,最好禁用内部编译器,并使用Crunch这样的外部工具。

如果你不这样做,你可能想限制Play使用单个文件(my.less),然后包括其中的所有其他文件。不能使用公共目录中的内部编译器编译LESS文件——它们只是静态资产。如果你想让Play访问它们,它们应该放在应用程序/样式表下。

还要注意的是,LESS 1.3在试图编译子目录中的文件时存在一些重大问题——这已经咬伤了播放框架邮件列表上的多人,尤其是Bootstrap,众所周知会出现错误。

我已经将Bootstrap LESS应用到我的项目中,如下所示:

在资产目录中进行引导"导入"文件。Play将编译它们。

appassetsbootstrap.less
appassetsresponsive.less

在例如appless 中具有其他".less"文件

编辑路径指向appless目录的bootstrap.less文件

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

在物理上,复杂的CSS进入

targetscala-2.9.1resource_managedmainpublic

但你仍然可以像在公共中那样引用它们

<link rel="stylesheet" media="screen" href="@routes.Assets.at("bootstrap.css")">

最新更新