【问题标题】:Grails resources: How to properly create environment-aware resources?Grails 资源:如何正确创建环境感知资源?
【发布时间】:2013-01-09 22:51:56
【问题描述】:

我非常喜欢 Grails 的资源插件,我们在 Grails 2.2 中的项目中广泛使用它。我现在想将其扩展一点,使其具有环境感知能力,例如,我可以避免在生产环境中加载某些真正仅用于开发和测试的 JavaScript 库。

根据 Grails 文档 (http://grails-plugins.github.com/grails-resources/guide/3.%20Declaring%20resources.html#3.2%20Resource%20artefacts),这应该是微不足道的,因为 grails-app/conf 文件夹中的这些 *Resources.groovy 文件应该是 Groovy ConfigSlurper 脚本(就像 DataSource.groovy 一样),因此支持“环境”块语法。

我的问题是,试图以文档似乎在说我只能完全破坏资源插件的方式来实现这种风格。再加上 IntelliJ IDEA 无法识别环境块,我不明白这应该如何工作。这就是我所说的,其中环境块正在抛出整个资源注入:

modules = {
    stuff {
        resource 'js/lib/script1.js'
        resource 'js/lib/script2.js'
    }
}

environments {
    production {
        stuff {
            resource 'js/lib/script1.js'
        }
    }
}

在这里,我只是想拥有一个模块,当在生产环境中运行时,该模块专门从“stuff”资源中排除特定脚本。如果有人能说出正确的方法来做到这一点,我将不胜感激!提前致谢!

更新!!!

好的,我想我已经找到了设置环境感知资源的正确方法。我现在唯一的问题是弄清楚如何在捆绑包中拥有默认资源,这样就不会在环境中出现所有这些重复。假设我有以下设置:

environments {
    development {
        modules = {
            stuff {
                resource 'js/script1.js'
                resource 'js/script2.js'
                resource 'js/OnlyForDevelopment.js'
            }
        }
    }
    production {
        modules = {
            stuff {
                resource 'js/script1.js'
                resource 'js/script2.js'
            }
        }
    }
}

写这个的正确方法是什么,以便可以将 script1 和 script2 设置为“stuff”资源包的默认值,这样它们就不必写出两次,每个环境块一次?这只是一个小例子,但我真的很想避免为每个环境块复制每个共享资源。有没有一个优雅的解决方案?是否有一个“通用”资源块,我可以在其中设置一个模板“东西”资源,作为环境感知版本添加的任何内容的基础?如果是这样,环境感知资源是否可以包含来自具有 dependsOn 语句的通用块的资源?我试图让这些事情发生,但无济于事。

【问题讨论】:

    标签: grails resources environment


    【解决方案1】:

    您可以使用dependsOn 来分隔共享模块。

    modules = {
    
        stuff {
           resource 'js/script1.js'
           resource 'js/script2.js'
        }
    
        devStuff {
           dependsOn 'stuff'
           resource 'js/OnlyForDevelopment.js'
        }
    
    }
    

    我们尽量不在我们的资源文件中放置环境配置。感觉有点神奇,你很快就会忘记哪些环境在哪里。这有点像维护噩梦。

    相反,在我们的布局中,我们可以根据环境设置模块,

    即,

    <g:if env='test'>
         <r:use module='testStuff...'/> </g:if> <g:else>
         <r:use module='stuff'/> 
    </g:else>
    

    (你明白了)。

    【讨论】:

    • 是的,我们肯定在我们的配置中大量使用了dependsOn。对特定于 env 的资源覆盖的需求从来都不是为了大量使用,只是通过不完全加载某些脚本资源来减轻 prod 的负载(即,仅需要用于测试目的的 JavaScript 库)。我们最终的解决方案是在我们的 grails 项目配置文件夹中使用多个配置 groovy 文件,允许 ApplicationResources 作为最终的聚合资源列表,同时从其他配置文件中引用资源,其中一些具有覆盖的环境块。干杯!
    【解决方案2】:

    我会选择你的替代方案,有不同的 Resources.groovy 文件,每个环境一个。那是

    GlobalResources.grooy

    modules = {
        globalScripts {
            resource 'js/script1.js'
            resource 'js/script2.js'
        }
    }
    

    ProductionResources.groovy

    environments {
        production {
            modules = {
                stuff {
                    dependsOn 'globalScripts'
                }
            }
        }
    }
    

    DevelopmentResources.goovy

    environments {
        development {
            modules = {
                stuff {
                    dependsOn 'globalScripts'
                    resource 'js/OnlyForDevelopment.js'
                }
            }
        }
    }
    

    我想这就是你所要求的。

    ps:我注意到您在最新答案中提到了不同的资源,但我不确定这是否是您所做的。

    【讨论】:

    • 这是否需要任何进一步的配置,还是按照惯例进行配置?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2019-12-16
    • 2021-02-27
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多