1

我有使用 Gradle J2ObjC 插件的建议和项目结构......其中的类等SharedCodeAndroid和模块的应用程序代码访问。这工作正常。iOSSharedCodeAndroidiOS

我想要做的是添加第四个名为的模块SharedCodeTestContracts,该模块具有依赖关系,SharedCode并且其类等将由and模块的测试代码而不是应用程序代码访问,如下所示:AndroidiOS

模块依赖

问题: J2ObjC Gradle 插件可以实现这样的事情吗?我可以有两个由 J2ObjC 翻译的模块...一个链接到 iOS应用程序目标,另一个包含 JUnit 测试并仅链接到 iOS测试目标?

关于原因的一些上下文:有时我在模块中定义一个接口,该接口将在and模块SharedCode中单独实现。为了避免两次编写相同的测试(在每个平台上一次),我希望将测试放在一个共享位置,每个模块都可以访问该位置。AndroidiOS

4

2 回答 2

1

这是一个起点。

我假设您此时已经有 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 项目(不是使用 j2objc 编译的 Java Gradle 项目)。如果你的 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 时,您的意思是 A 中的 B 链接。我澄清一下,因为这两者通常是相反的。

当您构建所有 Gradle 项目时,您将获得 2 个 J2ObjC 静态库,一个用于 SharedCode,一个用于 SharedCodeTestContracts。在您的 iOS Xcode 项目中,将应用程序目标链接到 SharedCode .a 文件,并将测试目标链接到 SharedCode 和 SharedCodeTestContracts。

于 2016-02-23T05:17:43.283 回答
0

感谢@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输出,但请参阅此处了解更多信息。

于 2016-03-04T11:02:32.777 回答