Возможно ли иметь два модуля общего кода Java в проекте?

У меня есть предложение SharedCode, Android а также iOS структура проекта с использованием плагина Gradle J2ObjC... где классы и т.д. в SharedCode Доступ к основному коду приложения Android а также iOS модули. Это отлично работает.

Что я хотел бы сделать, это добавить четвертый модуль с именем SharedCodeTestContracts который зависит от SharedCode и чьи классы и т. д. должны быть доступны с помощью тестового кода Android а также iOS модули, а не основной код приложения, а именно:

Зависимости модуля

Вопрос: возможно ли что-то подобное с плагином J2ObjC Gradle? Могу ли я иметь два модуля, которые переводятся J2ObjC... один, который связан с целью основного приложения iOS, а другой содержит тесты JUnit и только ссылки на цель тестирования iOS?

Немного контекста о том, почему: иногда я определяю интерфейс в SharedCode модуль, который должен быть реализован отдельно в Android а также iOS модули. Чтобы избежать написания одних и тех же тестов дважды (по одному на каждой платформе), я бы хотел, чтобы тесты были в общем месте, к которому могут обращаться все модули.

2 ответа

Решение

Спасибо @advayDev1 за указание в правильном направлении.

Решение состоит в том, чтобы объявить build.gradle файл из SharedCode модуль следующим образом:

plugins {
    id 'java'
    id 'com.github.j2objccontrib.j2objcgradle' version '0.6.0-alpha'
}

dependencies {
    compile 'com.google.guava:guava:18.0'
    testCompile 'junit:junit:4.12'
    testCompile 'org.hamcrest:hamcrest-core:1.3'
}

j2objcConfig {
    autoConfigureDeps true
    minVersionIos '8.4'
    xcodeProjectDir '../iOS'
    xcodeTargetsIos 'MySDK', 'MySDKTests'
    finalConfigure()
}

И объявить build.gradle файл из TestContracts модуль следующим образом:

plugins {
    id 'java'
    id 'com.github.j2objccontrib.j2objcgradle' version '0.6.0-alpha'
}

dependencies {
    compile project(':SharedCode')
    compile 'junit:junit:4.12' // this is compile scope deliberately
    compile 'org.hamcrest:hamcrest-core:1.3' // this is compile scope deliberately
}

j2objcConfig {
    autoConfigureDeps true
    minVersionIos '8.4'
    xcodeProjectDir '../iOS'
    xcodeTargetsIos 'MySDKTests'
    finalConfigure()
}

Исходя из вышеизложенного, при создании вашего проекта вы должны ожидать, что содержание вашего Podfile быть следующим:

target 'MySDK' do
    platform :ios, '8.4'
    j2objc_SharedCode
    import_other_pods
end

target 'MySDKTests' do
    platform :ios, '8.4'
    j2objc_TestContracts
    j2objc_SharedCode
    import_other_pods
end

В плагине J2ObjC Gradle есть ошибка, которая не дает ожидаемого результата. Podfile вывод, но смотрите здесь для получения дополнительной информации об этом.

Вот отправная точка.

Я предполагаю, что у вас уже есть SharedCode/build.gradle, работающий на данный момент.

В Android/build.gradle:

dependencies {
    compile project(':SharedCode')
    testCompile project(':SharedCodeTestContracts')
}

Примените плагин J2objC Gradle к SharedCodeTestContracts/build.gradle, а также убедитесь, что вы указали зависимость j2objcLinkage от общего кода:

dependencies {
    compile project(':SharedCode')
    j2objcLinkage project(':SharedCode')
}

Предположение 1: Ваш модуль Ios - это чистый проект Xcode ObjC/Swift (не проект Java Gradle, который скомпилирован с j2objc). Если ваш модуль Ios представляет собой проект Java Gradle, это все еще возможно, но с другим процессом. Прочитайте https://github.com/j2objc-contrib/j2objc-gradle/blob/master/dependencies.md#dependency-configurations о различных директивах зависимостей, которые вы можете использовать. Так же, как в Gradle Java есть 'compile' и 'testCompile', J2objc-Gradle имеет 'test' варианты своих директив зависимостей.

Предположение 2: стрелка от A до B означает, что B зависит от A на вашем чертеже. Кроме того, когда вы говорите, что A ссылается на B, вы имеете в виду, что B ссылается на A. Я проясняю, так как оба они обычно наоборот.

Когда вы соберете все свои проекты Gradle, вы получите 2 статические библиотеки J2ObjC, одну для SharedCode и одну для SharedCodeTestContracts. В вашем проекте iOS Xcode укажите целевую ссылку приложения только на файл SharedCode .a, а контрольную ссылку - на SharedCode и SharedCodeTestContracts.

Другие вопросы по тегам