首先,我来自.NET背景,所以请原谅我缺乏常规术语。当我在.NET商店时,我们使用TypeScript和C#来构建Web应用程序。在我们的控制器中,我们总是接收/响应DTO(数据xfer对象)。每次创建/修改DTO时都需要更新与之对应的TypeScript接口(d.ts文件),这一点非常令人头疼。
所以我们创建了一个小应用程序(一个简单的exe),它将来自webapp的dll加载到其中,然后反映在它上面以找到DTO(通过特定名称空间过滤),并通过它们解析以查找其中的每个类名,他们的财产,他们的财产'数据类型,将该信息生成为字符串,最后保存为d.ts文件。
然后将此应用程序配置为在网站的每个版本上运行。这样,当您去运行/调试/构建网站时,它会自动更新您的d.ts文件 - 这使得使用TypeScript变得更加容易。
长话短说,如果我要编写一个简单的常规应用来生成我想要的d.ts,我怎么能用Grails网站实现这个目标?
- 或 -
如何让IDE(例如IntelliJ)运行一个groovy文件(该应用程序的一部分),在构建后执行这一代?
我确实找到了这个,但仍需要一种在编译时运行的方法:
class Foo { def feck = "fe" def arse = "ar" def drink = "dr" } class Foo2 { def feck = "fe2" def arse = "ar2" def drink = "dr2" } def f = new Foo() def f2 = new Foo2() f2.properties.each { prop, val -> if(prop in ["metaClass","class"]) return if(f.hasProperty(prop)) f[prop] = val } assert f.feck == "fe2" assert f.arse == "ar2" assert f.drink == "dr2"
答案 0 :(得分:1)
我已经能够通过以下Gant脚本提取域对象及其持久性字段:
在 scripts / Props.groovy 中:
grails props
这可以通过命令行运行,如下所示:
{
"com.mycompany.User": [
{ "type": "java.lang.String" },
{ "username": "java.lang.String" },
{ "password": "java.lang.String" }
],
"com.mycompany.Person": [
{ "name": "java.lang.String" },
{ "alive": "java.lang.Boolean" }
]
}
产生如下输出:
{{1}}
这种方法的一些缺点是我们没有获得任何瞬态属性,而且我不确定如何将其挂钩到_Events.groovy eventCompileEnd事件中。
答案 1 :(得分:0)
谢谢凯文!只是想提一下,为了让它能够运行,这里有一些我必须确保做的事情,我认为我会分享:
- >打开grails BuildConfig.groovy
- >将tomcat从build更改为如下编译:
plugins {
compile ":tomcat:[version]"
}
- >将Props.groovy删除到根目录下的scripts文件夹中(注意grails-app文件夹的路径以供参考)
[application root]/scripts/Props.groovy
[application root]/grails-app
- >打开终端
gvm use grails [version]
grails compile
grails Props
注意:我正在使用Grails 2.3.11来运行我正在运行的项目。
这使得脚本中的所有内容都能成功运行。现在修改println部分以生成Typescript接口。
准备好后会发布github链接,所以请务必回来查看。