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

Grails资源:如何正确创建环境感知资源?,grails,resources,environment,Grails,Resources,Environment,我非常喜欢Grails的资源插件,我们正在Grails2.2中的项目中广泛使用它。现在我想对其进行一点扩展,使其具有环境意识,这样,例如,我就可以避免在生产中加载仅用于开发和测试的certian javascript库 根据Grails documentation(),这应该是微不足道的,因为Grails app/conf文件夹中的这些*Resources.groovy文件应该是groovy ConfigSlurper脚本(比如DataSource.groovy),因此支持“environmen

我非常喜欢Grails的资源插件,我们正在Grails2.2中的项目中广泛使用它。现在我想对其进行一点扩展,使其具有环境意识,这样,例如,我就可以避免在生产中加载仅用于开发和测试的certian javascript库

根据Grails documentation(),这应该是微不足道的,因为Grails app/conf文件夹中的这些*Resources.groovy文件应该是groovy ConfigSlurper脚本(比如DataSource.groovy),因此支持“environments”块语法

我的问题是,试图实现这种风格,就像文档中说的那样,我只能完全破坏资源插件。再加上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语句的通用块的资源?我试图让这些事情发生,但没有成功。

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

modules = {

    stuff {
       resource 'js/script1.js'
       resource 'js/script2.js'
    }

    devStuff {
       dependsOn 'stuff'
       resource 'js/OnlyForDevelopment.js'
    }

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

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

i、 e



(你明白了)

您可以使用dependsOn分离共享模块

modules = {

    stuff {
       resource 'js/script1.js'
       resource 'js/script2.js'
    }

    devStuff {
       dependsOn 'stuff'
       resource 'js/OnlyForDevelopment.js'
    }

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

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

i、 e



(你明白了)

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

GlobalResources.grooy

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

modules = {
    globalScripts {
        resource 'js/script1.js'
        resource 'js/script2.js'
    }
}
environments {
    production {
        modules = {
            stuff {
                dependsOn 'globalScripts'
            }
        }
    }
}
environments {
    development {
        modules = {
            stuff {
                dependsOn 'globalScripts'
                resource 'js/OnlyForDevelopment.js'
            }
        }
    }
}
开发资源。goovy

modules = {
    globalScripts {
        resource 'js/script1.js'
        resource 'js/script2.js'
    }
}
environments {
    production {
        modules = {
            stuff {
                dependsOn 'globalScripts'
            }
        }
    }
}
environments {
    development {
        modules = {
            stuff {
                dependsOn 'globalScripts'
                resource 'js/OnlyForDevelopment.js'
            }
        }
    }
}
我想这就是你想要的


ps:我注意到你在最新的答案中引用了不同的资源,但我不确定你是否这样做。

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

GlobalResources.grooy

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

modules = {
    globalScripts {
        resource 'js/script1.js'
        resource 'js/script2.js'
    }
}
environments {
    production {
        modules = {
            stuff {
                dependsOn 'globalScripts'
            }
        }
    }
}
environments {
    development {
        modules = {
            stuff {
                dependsOn 'globalScripts'
                resource 'js/OnlyForDevelopment.js'
            }
        }
    }
}
开发资源。goovy

modules = {
    globalScripts {
        resource 'js/script1.js'
        resource 'js/script2.js'
    }
}
environments {
    production {
        modules = {
            stuff {
                dependsOn 'globalScripts'
            }
        }
    }
}
environments {
    development {
        modules = {
            stuff {
                dependsOn 'globalScripts'
                resource 'js/OnlyForDevelopment.js'
            }
        }
    }
}
我想这就是你想要的


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

是的,我们在配置中肯定大量使用Dependesson。对特定于env的资源覆盖的需求从来不是为了大量使用,只是为了通过不完全加载一些脚本资源来减轻prod中的负载(即,仅用于测试目的的JavaScript库)。我们的最终解决方案是在grails项目配置文件夹中使用多个config groovy文件,允许ApplicationResources充当最终的聚合资源列表,同时引用来自其他配置文件的资源,其中一些配置文件具有覆盖的环境块。干杯是的,我们在配置中肯定大量使用dependsOn。对特定于env的资源覆盖的需求从来不是为了大量使用,只是为了通过不完全加载一些脚本资源来减轻prod中的负载(即,仅用于测试目的的JavaScript库)。我们的最终解决方案是在grails项目配置文件夹中使用多个config groovy文件,允许ApplicationResources充当最终的聚合资源列表,同时引用来自其他配置文件的资源,其中一些配置文件具有覆盖的环境块。干杯这是否需要任何进一步的配置或此配置是按约定的?这是否需要任何进一步的配置或此配置是按约定的?