Grails资源:如何正确创建环境感知资源?

时间:2013-01-25 21:46:27

标签: grails resources environment

我非常喜欢Grails的资源插件,我们在Grails 2.2中广泛使用它。我现在想要将其扩展为环境感知,例如,我可以避免在生产中加载真正只需要开发和测试的certian 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”资源中排除特定脚本。如果有人能说出正确的方法来做到这一点,我将非常感激!提前谢谢!

UPDATE !!!

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

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”资源包的默认值,这样就不必为每个环境块一次写出两次?这只是一个小例子,但我真的希望避免为每个环境块复制每个共享资源。对此有优雅的解决方案吗?可以有一个“通用”资源块,我可以在其中设置模板“stuff”资源,它将成为环境感知版本添加的任何基础吗?如果是这样,环境感知资源是否可以包含来自带有dependsOn语句的通用块的资源?我试图让这些事情发生,但无济于事。

2 个答案:

答案 0 :(得分:3)

您可以使用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>

(你明白了)。

答案 1 :(得分:1)

我会选择您的替代方案,拥有不同的 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:我注意到你在最新的答案中引用了不同的资源,但我不确定这是不是你做的。