我有一个库,其中包含使用android.util.Log
:的公共代码
java_library(
name = "common",
srcs = glob(["*.java"]),
)
我有一个适用于iOS的j2objc规则,它运行得很好:
j2objc_library(
name = "common_ios",
deps = ["//common"],
jre_deps = ["@bazel_j2objc//:android_util_lib"],
)
但当我在Android项目中使用common
时:
android_binary(
name = "app",
srcs = glob(["*.java"]),
manifest = "//android:manifest",
resource_files = ["//android:resources"],
deps = ["//common"],
)
但当我运行bazel build //android:app
时,我得到:
common/MyVeryOwnLogger.java:3: error: package android.util does not exist
import android.util.Log;
这是有道理的,因为android.*
库在java_library
规则中不应该可用。我是不是错过了什么?这不是建议的设置项目的方式吗?
谢谢!
java_library
将无法编译依赖于Android的代码,因为它没有android_library
提供的任何Android依赖项。
您是否尝试过在依赖common
的情况下运行使用Android类的iOS应用程序?我有点惊讶,这是有效的。
在任何情况下,我都建议将依赖于平台的内容从common
移到特定于平台的规则中。
例如,假设您在common
中有某种业务逻辑Model
类,它需要一个记录器,在common
中创建一些类似Logger
的接口,并让Model
获取Logger
的实例。然后,您可以有一个依赖于common
的android_library
规则,并为使用android.util.*
中所有类的Android提供Logger
的实现。那么您的android_binary
规则取决于common
和android_library
。在您的应用程序代码中,您可以实例化Android特定记录器的实例,并将其传递给Model
。
对于iOS的一半,你可以类似地有一个objective-c规则,它提供iOS特定的日志记录(尽管我不太熟悉objective-c或iOS中的所有功能)。
您还可以考虑将common
分解为单独的规则,这将提高递增性(例如,将日志记录放入自己的规则中)。这一切都取决于代码的结构。