带有 3rd 方库的 Grails Asset-Pipeline 系统

Posted

技术标签:

【中文标题】带有 3rd 方库的 Grails Asset-Pipeline 系统【英文标题】:Grails Asset-Pipeline system with 3rd party libs 【发布时间】:2014-07-05 08:02:01 【问题描述】:

Grails 2.4 现在使用 资产管道 来管理和处理 Grails 应用程序中的静态资产,而不是资源系统。这是相当新的,互联网上还没有太多关于它的文档。

我的问题是,如何正确处理 3rd 方库?

例如,select2 (http://ivaynberg.github.io/select2/) 库将其所有 .css、.js、图像文件放在一个平面文件夹中。

我应该将不同的文件类型复制到它们对应的assets/javascripts/assets/stylesheets/ 等子文件夹中吗?如何处理 .json、文本或 doc 文件等没有明显位置的文件?

我应该创建一个vendors/select2/ 文件夹吗?在哪里,在assets/web-app/?然后,我应该如何从我的 GSP 中加载所有必要的文件?

这个库也仅在表单视图中需要,因此除非需要,否则不应加载。

【问题讨论】:

【参考方案1】:

Baxxabit 的回答让我找到了解决方案。我一直在为同样的事情苦苦挣扎,但想充分利用管道,以便我可以使用 less-asset-pipeline 插件。

以 bootstrap 为例,我创建了一个 vendor 文件夹作为标准资产文件夹的对等文件夹,然后将 bootstrap 文件放到了那里。

application.js:

//This is a javascript file with its top level require directives
//= require jquery
//= require bootstrap-3.1.1/javascript/bootstrap
//= require_tree views
//= require_self
...

和application.css:

/*
*= require_self
*= require main
*= require mobile
*= require bootstrap-3.1.1/stylesheets/bootstrap
*= encoding UTF-8
*/

要覆盖 boostrap 自定义,我可以简单地将自定义 variables.less 文件拖放到 ./grails-app/assets/vendor/bootstrap-3.1.1/stylesheets/variables.less 中。 assets 下的第一个文件夹在覆盖文件时会被忽略,此后路径需要与您放在 vendor 下的任何内容相匹配。

这给了我这种层次结构:

grails-app/assets/
├── images
...
├── javascripts
│   └── application.js
├── stylesheets
│   ├── application.css
│   ├── bootstrap-3.1.1
│   │   └── stylesheets
│   │       └── variables.less
│   ├── errors.css
│   ├── main.css
│   └── mobile.css
└── vendor
    └── bootstrap-3.1.1
        ├── javascript
        │   ├── bootstrap.js
        │   └── bootstrap.min.js
        └── stylesheets
            ├── alerts.less
...
            ├── variables.less
            └── wells.less

我喜欢这个结果。我已经清楚地描述了分布式包并且相对容易升级,并且我已经将该包的更改分离到一个清晰可识别的自定义文件中。

我在https://github.com/ggascoigne/grails-pipeline-scss 放了一个使用 sass-asset-pipeline 插件的示例。

【讨论】:

你甚至可以将这个结构与凉亭一起使用,不是吗? 优秀的建议应该是官方文档的一部分。如果您有两个以上的库,则为每个库使用清单将有助于进一步扩展。 bower 在这张图片中有一个不错的位置,尽管您仍然需要将内容从 bower_components 复制到 assets。 我将 Bower 用于我的前端资产,您的 github 项目帮助很大。 这对我来说非常有效。似乎缺少文档中的信息(或至少很难找到)。 你可以添加一个 .bowerrc 文件来将 bower 指向你的 assets/vendor 文件夹【参考方案2】:

您可以在标准文件夹(javascript、样式、图像)附近创建另一个文件夹,如 jsplugins,然后您可以在必要的页面中包含 js 库,如果您不想在所有页面上使用此库。

制作这样的东西:

<assets:javascript src="select2/pathToYourJSFile"/>

注意:您可以省略assets 路径下的第一级路径,在本例中为jsplugins

最好的方法是使用 manifest.js 文件,您可以在其中通过require 指令包含必要的文件。

您应该使用 assests 文件夹而不是 web-app。在构建 war 文件期间,资产中的所有文件都将被复制到 web-app 文件夹。

来自 Bobby Warner 的有用视频:http://www.youtube.com/watch?v=VHDBlGtAHB4

文档:http://bertramdev.github.io/asset-pipeline/

【讨论】:

【参考方案3】:

资产管道对我来说似乎是一个倒退。我显然不能再使用 cdnjs 或类似的 CDN 来访问外部库了。我真的放弃了所有这些来为我自己的 JS 代码进行 JS 缩小吗?

【讨论】:

我认为资产管道文档 (bertramdev.github.io/asset-pipeline/guide/index.html) 中的“从外部存储目录服务资产”可能会对您使用 CDN 有所帮助。 不,我不想将内容复制到 cdnjs,我只想在我的应用中使用 cdnjs 提供的资产。【参考方案4】:

这对于 assets 文件夹下的资产来说效果很好,但鉴于 Web 组件和 javascript 框架的激增,我们经常发现自己在检查 Grails 项目之外的外部项目,我们希望将这些项目打包并与我们的应用程序一起分发。您还会遇到这样的情况,即应用程序的前端由非 Grails 开发人员的前端开发人员开发,他们使用不同的工具以与 Grails REST 服务断开连接的方式开发和测试前端。

因此,与其将外部项目的资产复制到您的 grails 应用程序中,您如何引用外部文件夹,这将确保在开发期间运行应用程序时,这些资产将包含在您的应用程序中,以及何时WAR 应用程序进行部署?

【讨论】:

【参考方案5】:

要处理 3rd 方库,您可以在 assets 文件夹中添加 Flipcountdown 文件夹,

├── 资产 │ ├── 倒计时 │ │ ├── 管理员 │ │ └── 全球 │ ├── 图片 │ │ ├── apple-touch-icon.png │ │ ├── apple-touch-icon-retina.png │ │ ├── favicon.ico │ │ ├── grails_logo.png │ │ ├── 皮肤 │ │ ├── spinner.gif │ │ └── springsource.png │ ├── javascripts │ │ ├── application.js │ │ └── jquery-2.1.3.js │ └── 样式表 │ ├── application.css │ ├── errors.css │ ├── main.css │ └── mobile.css

现在您可以使用普通语法引用 css 和 js,

<assets:javascript src="admin/pathToYourJSFile"/>
<assets:stylesheet src="admin/pathToYourCSSFile"/>
<assets:stylesheet src="global/pathToYourCSSFile"/>

【讨论】:

以上是关于带有 3rd 方库的 Grails Asset-Pipeline 系统的主要内容,如果未能解决你的问题,请参考以下文章

如何发布使用外部 3rd 方库的 iPhone 应用程序?

请建议 Fiddler Core 3rd 方库的替代方案

在不使用 3rd 方库的情况下获取访客位置(IP)[重复]

在不使用 3rd 方库的情况下,在反应本机中显示主屏幕之前显示启动屏幕

如何获取需要在 Synology NAS 的任务计划程序中运行的第 3 方库的 python 脚本?

我应该使用 Java 日期和时间类还是使用像 Joda Time 这样的 3rd 方库?