【问题标题】:Play Framework: How to configure compileable [LESS] assets outside of /appPlay Framework:如何在 /app 之外配置可编译的 [LESS] 资产
【发布时间】:2012-08-28 18:58:53
【问题描述】:

我有一个使用引导程序的 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”后访问网络应用程序时,(或者如果我运行 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]

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

自定义入口点工作正常。也就是说,如果我更改它们,使它们都在 /app 下并将较少的文件从引导程序移到那里,它们就可以工作。如果我在公共下移动图像和 js 文件,那也可以。但我想要实现的是干净的分离。

我很确定我没有正确理解如何使用 playAssetsDirectories 和 playExternalAssets,我已经为这些设置尝试了许多变体。我不确定我正在尝试的是否可行或设置应该如何关联 - 例如lessEntryPoint 是否必须在资产目录中,并且 externalAssets 是否被视为资产目录?谁能指出我哪里出错了?提前致谢。

【问题讨论】:

    标签: playframework-2.0 sbt


    【解决方案1】:

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

    如果您不这样做,您可能希望限制 Play 使用单个文件 (my.less),然后从其中包含所有其他文件。您不能使用公共目录中的内部编译器编译 LESS 文件——它们只是静态资产。如果您希望 Play 能够访问它们,它们应该位于 app/stylesheets 下。

    还要注意,LESS 1.3 在尝试编译子目录中的文件时存在一些重大问题——这已经在 play-framework 邮件列表中吸引了多个人,尤其是 Bootstrap 会因错误而崩溃。

    【讨论】:

    • 您好,感谢您的回答。我将尝试在 LESS 中使用 import 的方法并使用结果进行更新。
    • 我试过了,只要每个 less 文件(从导入树一直向下)直接导入到 Play2 知道的文件中,我就可以让它工作。基本上 my.less 文件变成了经过编辑的 bootstrap.less。
    【解决方案2】:

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

    在资产目录中有引导“导入”文件。 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")">
    

    【讨论】:

    • 感谢您的回答。当 .less 文件位于 /app 下时,我绝对可以正确编译引导程序,但我的问题特别是关于如何保持引导程序干净分离,即在 /app 之外。
    • 我的虚拟澄清,如果你只有在 app/assets 中导入 bootstap.less 并编辑其中的路径“@import”..what/ever/path/outside/app/reset。少”。您是否需要在“应用程序”之外进行引导?
    • 我想要在外部引导的原因是我可以将它作为一个 git 子模块进行管理,从而使更新到新版本变得微不足道。当有新版本的引导程序时,我所要做的就是检查子模块中的标签并修复任何不兼容性,而不是将文件复制到播放应用程序的不同部分。我会尝试导入,我认为它会起作用,然后需要弄清楚如何将 bootstrap/img 和 bootstrap/js 添加到资产控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2011-12-19
    • 1970-01-01
    • 2016-07-29
    相关资源
    最近更新 更多