2014-01-13 49 views
1

我是Gradle和Groovy的新手,我试图定义一个在MySQL中执行SQL脚本的任务。这是我到目前为止有:Gradle任务原型设计

task executeSomeSQL(type: Exec){ 
    def pwd = getMySQLPwd() 
    workingDir './' 
    commandLine 'mysql', '-uroot', "--password=$pwd", 'dbname' 
    standardInput file('database/script.sql').newInputStream() 
} 

现在这工作正常,但是,我想能够定义很多这样的任务,只有在他们采取了输入脚本不同。在我看来,我需要一种方法来使用通用属性(获取密码,设置工作目录和设置命令)对SQL执行任务进行原型设计,然后使用自己的文件名定义每个任务。在一种伪代码的:

// define a function or closure? this doesn't work because the 
// three task specific properties aren't defined 
def sqlExecutorDef(filename){ 
    def pwd = getMySQLPwd() 
    workingDir './' 
    commandLine 'mysql', '-uroot', "--password=$pwd", 'dbname' 
    standardInput file(filename).newInputStream() 
} 

// this is truly pseudocode: somehow the task should be created 
// using a function that defines it 
task executeSomeSQL(type: Exec) = sqlExecutorDef('database/script.sql') 

这样,我可以定义许多任务,每一个需要被执行,有一个班轮SQL脚本之一。

编辑:对于具有更多Groovy经验的人来说,这可能是微不足道的。我道歉!

+0

要做到这一点,你会写在内部使用'project.exec'执行SQL脚本自己的任务类。您可以在[Gradle用户指南](http://gradle.org/docs/current/userguide/userguide_single.html)中了解有关编写任务类的更多信息。 –

回答

2

虽然这可能不是标准的Gradle,但动态任务可能会有帮助。下面的示例使用既作为任务名称(用一些按摩)SQL文件的列表:(它简单地打印到控制台,但在执行的SQL应该给你原来的工作是直线前进):

def username = "admin" 
def password = "swordfish" 

def taskNames = ["abc_sql", "def_sql", "ijk_sql"] 

taskNames.each { taskName -> 
    def sqlFile = taskName.replaceAll("_", ".") 

    task "${taskName}" (type:Exec) { 
     workingDir "." 
     commandLine "echo", "run SQL script '${sqlFile}' as ${username}/${password}"   
    } 
} 

gradle tasks得出:

[snip] 
Other tasks 
----------- 
abc_sql 
def_sql 
ijk_sql 

“abc_sql”的例子来看:

bash-3.2$ gradle abc_sql 
:abc_sql 
run SQL script 'abc.sql' as admin/swordfish 
+0

这是一个非常有趣的做法。可以使用包含任务名称和SQL文件的小型自定义类来代替'taskNames',这样可以将它们保持分离(我有很长的SQL文件名)。谢谢! –