Возможно ли иметь два модуля общего кода 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.