【问题标题】:Grails asset-pipeline - nothing availableGrails 资产管道 - 没有可用的
【发布时间】:2014-07-16 08:27:06
【问题描述】:

我有一个当前在 2.2.4 下运行的 Grails 应用程序。我决定将它升级到 2.4.0,并在这样做时将其转换为使用我的 css/js/images 的资产管道。我将所有旧资源都放在了新 assets/... 目录中。

我正在使用 IntelliJ 12.1.7 在调试模式下运行应用程序以进行开发。该应用程序启动得很好,但我的资产似乎都不可用。雄猫 7.0.52.1。 Java 7.0.55。我在原始 html 中看到诸如“main.css?compile=false”之类的引用,但是当我尝试直接在浏览器中查看它时,资产本身不可用(http:\localhost:8080\assets\stylesheets\main .css)。我也会在这里稍微展示一下我的无知,并询问“?compile = false”是什么。这对我来说是新的。

我运行“grails clean”。我需要在 config.groovy 或任何其他文件中进行任何更改吗?我确实根据 Grails 文档进行了更改以删除对旧“资源”系统的引用。

任何想法为什么资产似乎没有被插件拾取?

更新:翻译中一定有一些东西丢失了,因为当我从头开始创建应用程序时,资产加载得很好,就像我在文档中引用时所期望的那样。我已经交叉检查了我的 BuildConfig 和 Config 文件中的设置,它们在 2 个应用程序之间匹配。他们还使用所有插件的相同版本。如果我找到解决方案,我会在这里发布,但坦率地说,我认为我的下一个业务顺序是逐渐开始将我的应用程序中的部分导入到新创建的应用程序中,因为似乎某处隐藏了一个设置我不知道在我的旧代码库中不存在的 2.4.0 创建期间进行配置。或者有一些遗留的“资源”插件没有被删除。幸运的是不是一个巨大的应用程序。

更新 2:我找到了问题的根源。我的应用程序使用 Apache Shiro 进行安全性和身份验证。安装插件不会导致问题,但是一旦我运行“grails shiro-quick-start”,资产管道就会停止工作。我正在为这个问题添加一个标签,希望有 Shiro 知识的人能够提供帮助。我还在 grails jira (https://jira.grails.org/browse/GPSHIRO-79) 上创建了一个错误

更新 3:已找到并实施了解决方法。请参阅上面的 jira 链接。

【问题讨论】:

  • compile=false 这与生产模式等有关,所以基本上是的,它已经加载了它。

标签: grails asset-pipeline shiro


【解决方案1】:

昨晚开始学习资产升级插件时遇到了类似的问题。

诀窍是在浏览器中加载 Web 开发者控制台,并在加载时查看输出 -

一切正常吗?可能是加载的顺序不正确:

对于 css:application.css

看看上面然后看看包含文件夹

对于JS:application.js

查看声明,然后遵循文件夹结构 - 更有意义。

简而言之,CSS 应该没问题,但 JS 需要特定的顺序,具体取决于您加载的内容

对于 js 来说

//= require jquery/jquery
//= require bootstrap/bootstrap
//= require angular/angular
//= require angular-route/angular-route
//= require angular-resource/angular-resource.min
//= require angular-table/ng-table
//= require myapp/index
//= require myapp/services
//= require myapp/arrestedDirectives
//= require_tree custom-folder
//= require_tree views
//= require_self

这将按照定义文件的顺序加载,在底部需要树文件夹名称以在这些文件夹中加载通配符(顺序无关紧要)

CSS

*= require mobile
*= require_self
*= require bootstrap
*= require bootstrap-glyphicons

这是定义的顺序

在js中

require_tree custom-userapp

如果我想要一个必须添加的特定顺序,这将加载 custom-userapp 文件夹中的所有内容,没有定义的结构:

//= require custom-userappthis/js1
//= require custom-userappthis/js2

-- E2A:根据我目前的理解对资产的完整解释:

所以在你的 application.js 的顶部它显示:

//= require jquery
//= require_tree .
//= require_self

Self 3类型的declation:

1 require 
//=require         -- This is a custom file or folder/file
 //require folder/file   --> [load folder/file.js] 

2. require_tree 

//require_tree .             --> [everything in current  folder]
//require_tree folder     --> [ this one is wild card in the folder ]

3. require_self -itself - this can contain global declarations   
//require_self 

现在这是位于 grails-app/assets/javascripts/ 中的主要 application.js

  <asset:javascript src="application.js"/>
  <asset:stylesheet href="application.css" />

因此,如果您现在转到 grails-app/views/layouts/main.gsp,您会发现 application.js 和 application css 都声明了{如上}。

css 文件格式有点不同,它以 * 开头并遵循上述格式

*= require main
*= require mobile
*= require_self
*/

只要定义了所有内容,就应该通过上述两个application.js和css加载到结束页面上。

如果你想你不能在 js 中定义一些东西需要特定的定义,然后像这样加载另一组调用:

 <asset:javascript src="myfolder/application.js"/>
  <asset:stylesheet href="myfolder/application.css" />

如果您希望实现相同的资产配置或将 application.js 替换为 jquery-ui.js 并使其加载 jquery-ui.js 物理 js 文件,请遵循上述文件格式。

不确定为什么您需要为一个常见/实用的网站执行此操作,因为只要在主文件中正确声明所有内容,它就可以工作。

我提到了 web 开发者控制台 - 这是 firefox 开发者工具,在主控制台中它显示加载了哪些 url - 如果好的,您将能够识别 css/js 文件和 200 的状态..

我已将 testingarrested 更新到 2.4,因此它已安装 assets stuff

最终更新:

如果您有几个 CSS 文件,可以说您安装了包含 css/js 的引导文件夹,并且您只希望该 css 文件用于您的整个站点,并且可能还有另一个自定义 css,您可能来自内部的另一个文件夹.js 文件夹。然后删除 stylesheets 文件夹,只在 application.js 中有你的 js 引用 然后在你的 main.gsp 中

    <asset:stylesheet href="bootstrap-css/css/bootstrap.css" />
    <asset:stylesheet href="customfolder/css/custom.css" />
    <asset:javascript src="application.js"/>

我认为这只是对资产的总结接受空白支票

【讨论】:

  • 那么,我是否需要在 application.* 文件中指定我的脚本/等以及在 gsp 中包含标签(例如 ? 我的印象是非此即彼。
  • 你为什么不在 2.4 下安装被逮捕的插件并按照说明更好地了解我做了什么。简而言之,不要只在主 application.js 和 css 中定义它们,然后在你的 layouts/main.gsp 中定义它们,你会发现它们都已声明,并且它们本身与声明将按照你定义或预期的方式加载内容
【解决方案2】:

一种解决方法(也可能是解决方案)是将 ShiroSecurityFilters.groovy 中的以下行从

if (!controllerName) return true

if (!controllerName || controllerName == 'assets') return true

详情请参阅原帖中的更新 3。

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    相关资源
    最近更新 更多