2015-02-06 3 views
0

Я хочу создать структуру для своего нового проекта, и я намерен построить его с помощью Gradle. Я уже знаю, что если я размещаю источники и тесты в одном проекте, то плагины, такие как MoreUnit, будут легко справляться с этим и создавать тесты для моих классов, где я их хочу.1 Проект Eclipse, 2 артефакта с Gradle

Однако он создает некоторые неудобные проблемы с зависимостями, когда мой проект состоит из нескольких подпроектов в зависимости друг от друга - если быть точным, когда я хочу использовать некоторый общий код в тестах в проекте A, а затем повторно использовать его в тестах в BI проекта, сделать некоторые обходные пути, как

project(':B') { 
    // ... 
    dependencies { 
    // ... 
    if (noEclipseTask) { 
     testCompile project(':A').sourceSets.test.output 
    } 
    } 
} 

иногда не были какие-то проблемы оценки, чтобы другой хак должен был быть введен:

project(':B') { 
    evaluationDependsOn(':A') 
} 

Расщепление это в 2 отдельных проектов, избавившись от этого вопроса, но тогда MoreUnit больше не было в состоянии отслеживать, где он должен создавать новые тестовые файлы, и отмечать, какие методы были протестированы. Я не нашел ничего в конфигурации MoreUnit, которая позволила бы мне исправить это, поэтому я пытаюсь исправить это со стороны Gradle.

Можем ли мы договориться, чтобы у меня было несколько подпроектов, источники и тесты были устроены как maven (project/src/java, project/test/java), но тесты и источники создадут отдельные артефакты? Если я решаю неправильную проблему, тогда как я должен решить правильный?

ответ

1

Вы можете создать несколько testenv баночки для общего типа:

sourceSets { 
    testenv { 
     compileClasspath += main.output 
     runtimeClasspath += main.output 
    } 
} 

configurations { 
    testenvCompile { 
     extendsFrom runtime 
    } 
    testCompile { 
     extendsFrom testenvRuntime 
    } 
    testenvDefault { 
     extendsFrom testenvRuntime 
    } 
} 

и

task testenvJar(type: Jar, group: 'build', description: 'Assembles a jar archive containing the testenv classes.') { 
    from sourceSets.testenv.output 

    appendix = 'testenv' 

    // add artifacts to testenvRuntime as task 'jar' does automatically (see JavaPlugin#configureArchivesAndComponent:106 and http://www.gradle.org/docs/current/userguide/java_plugin.html, "Figure 23.2. Java plugin - dependency configurations") 
    configurations.testenvRuntime.artifacts.add new org.gradle.api.internal.artifacts.publish.ArchivePublishArtifact(testenvJar) 
} 

task testenvSourcesJar(type: Jar, group: 'build', description: 'Assembles a jar archive containing all testenv sources.') { 
    from sourceSets.testenv.allSource 

    appendix = 'testenv' 
    classifier = 'sources' 
} 

artifacts { 
    archives testenvJar 
    archives testenvSourcesJar 
} 

и использовать его в своих проектах, как зависело

testCompile project(path: ':common', configuration: 'testenvDefault') 

Я надеюсь, что это помогает!

+0

Спасибо за ответ! У меня есть некоторые сомнения, которые я хотел бы решить. Обычно вы имеете в виду тестовый код, который я хочу разделить между тестовыми проектами? Должно ли ваше решение применяться к подходу 1-project-with-src-and-test или к двум отдельным проектам? Должен ли первый фрагмент кода размещаться на уровне корневого проекта или в рамках проекта сообщества? –

+0

Весь приведенный выше код может быть применен к общему проекту, который генерирует '' 'common-v1.0.jar''' и' '' common-testenv-v1.0.jar'''. Оба могут использоваться для их целей ... –

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