2014-01-13 2 views
1

Я новичок в Gradle and Groovy, и я пытаюсь определить задачу, которая выполняет SQL-скрипт в MySQL. Вот то, что я до сих пор:Создание прототипа задачи оградности

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 скрипт, который должен быть выполнен, с одной гильзе.

EDIT: это, вероятно, тривиально для кого-то, у кого больше опыта 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

Это действительно интересный способ сделать это. Вместо 'taskNames' можно было использовать небольшой пользовательский класс, содержащий имя задачи и файл SQL, чтобы их можно было разделить (у меня есть уродливые длинные имена файлов SQL). Благодаря! –

Смежные вопросы