上一章节我们解说了dagger系列(三)之Bazel构建dagger2.29.1解说根目录下WORKSPACE,他干啥的,在我看来就是引入一些jar包,提供给build。**比如:**根目录下的BUILD文件代码这里的@google_bazel_common(遇哽rules_java别找了,我全文件搜索也没用找到,这个是bazel默认存在)
load("@rules_java//java:defs.bzl", "java_library") load("@google_bazel_common//tools/javadoc:javadoc.bzl", "javadoc_library") load("@google_bazel_common//tools/jarjar:jarjar.bzl", "jarjar_library")google_bazel_common的引用在根目录WORKSPACE中:如下所示,name = “google_bazel_common”
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "google_bazel_common", sha256 = "7e5584a1527390d55c972c246471cffd4c68b4c234d288f6afb52af8619c4560", strip_prefix = "bazel-common-d58641d120c2ad3d0afd77b57fbaa78f3a97d914", urls = ["https://github.com/google/bazel-common/archive/d58641d120c2ad3d0afd77b57fbaa78f3a97d914.zip"], )验证: 1.下载https://github.com/google/bazel-common/archive/d58641d120c2ad3d0afd77b57fbaa78f3a97d914.zip文件并解压 2.找tools/javadoc:javadoc.bzl路径,找到:javadoc.bzl并可以找到javadoc_library方法 题外话:我老婆说我啰嗦,感觉自己是有那么点,啰嗦就啰嗦吧,那我们继续啰…继续讲吧
bazel官网
dagger官网
根目录下WORKESPACE该提供的也提供了,要啥给啥,相当于公司董事长。根目录下BUILD相当于一个公司总经理,给每个子package分派任务,具体如何完成又需要每个子目录中的BUILD(那就是分模块经理喽)实现
1.引入规则 java_library:官网解释,This rule compiles and links sources into a .jar file.生成可用的jar文件
插播 start java_library和java_binary区别??? 搜了很久以及通过dagger系列(二)续之Bazel构建java项目(官网的翻译)实践得知,java_library仅仅导出自己相关的jar文件,但是java_binary还会其所依赖的文件jar文件 插播 end
javadoc_library:根据官网描述,生成下相关java文档
jarjar_library:可以理解问一个很好用的打包工具
load("@rules_java//java:defs.bzl", "java_library") load("@google_bazel_common//tools/javadoc:javadoc.bzl", "javadoc_library") load("@google_bazel_common//tools/jarjar:jarjar.bzl", "jarjar_library")后面根据实例再深入了解
2.项目打包 default_visibility 设置项目属于公共类型(public等同于java等语法),package_group构建项目命名为src,packages 表示使用当下目录
package(default_visibility = ["//visibility:public"]) package_group( name = "src", packages = ["//..."], )3.生成jar文件
java_library( name = "dagger_with_compiler", exported_plugins = ["//java/dagger/internal/codegen:component-codegen"], exports = ["//java/dagger:core"], ) java_library( name = "producers_with_compiler", exports = [ ":dagger_with_compiler", "//java/dagger/producers", ], )java_library表示生成jar文件,查看以下下几个属性:
name:表示生成的jar文件名称
exported_plugins :表示该路径下的插件依赖于本库 exported_plugins = ["//java/dagger/internal/codegen:component-codegen"],表示java/dagger/internal/codegen路径下的BUILD文件,里component-codegen插件依赖于本库
exports :导出的库,导出的dagger_with_compiler.jar库内容在//java/dagger路径下的BUILD文件,命名为core的规则中进行
(以上说法有误,exports正确理解:如果一个外部项目依赖于当前的name目标,则exports中的依赖肯定也会跟随着一起导出)
producers_with_compiler.jar内容包含dagger_with_compiler.jar和//java/dagger/producers(直接找它的BUILD文件即可)
4.生成android jar文件
android_library( name = "android", exported_plugins = ["//java/dagger/android/processor:plugin"], exports = ["//java/dagger/android"], ) android_library( name = "android-support", exports = [ ":android", "//java/dagger/android/support", ], )name:生成的jar文件命名 exported_plugins :表示//java/dagger/android/processor BUILD的plugin插件依赖于本库 exports :导出的库文件目录,同样的查找目录下BUILD文件 (以上说法有误,exports正确理解:如果一个外部项目依赖于当前的name目标,则exports中的依赖肯定也会跟随着一起导出)
5.jarjar_library
jarjar_library( name = "shaded_android_processor", jars = [ "//java/dagger/android/processor", "@maven//:com_google_auto_auto_common", ], rules = [ "rule com.google.auto.common.** dagger.android.shaded.auto.common.@1", ], ) jarjar_library( name = "shaded_grpc_server_processor", jars = [ "//java/dagger/grpc/server/processor", "@maven//:com_google_auto_auto_common", ], rules = [ "rule com.google.auto.common.** dagger.grpc.shaded.auto.common.@1", ], )bazel官网并没有提供jarjar_library的名词注解,那咋办?找呗,顺藤摸瓜,找到load("@google_bazel_common//tools/jarjar:jarjar.bzl", “jarjar_library”),google_bazel_common对应于WORKSPACE文件:
http_archive( name = "google_bazel_common", sha256 = "7e5584a1527390d55c972c246471cffd4c68b4c234d288f6afb52af8619c4560", strip_prefix = "bazel-common-d58641d120c2ad3d0afd77b57fbaa78f3a97d914", urls = ["https://github.com/google/bazel-common/archive/d58641d120c2ad3d0afd77b57fbaa78f3a97d914.zip"], )最终我们锁定到jarjar官网 一波解释来了:跟换原先jar包名 name:新生成的jar文件名 jars:原先的包信息(猜的,没找着,稍等等到了解读这里的代码,应该是可以分辨正确与否) rules:规则,或者引入依赖信息(见名知意,应该不需要猜想吧)
6.javadoc_library
# coalesced javadocs used for the gh-pages site javadoc_library( name = "user-docs", testonly = 1, srcs = [ "//java/dagger:javadoc-srcs", "//java/dagger/android:android-srcs", "//java/dagger/android/support:support-srcs", "//java/dagger/grpc/server:javadoc-srcs", "//java/dagger/grpc/server/processor:javadoc-srcs", "//java/dagger/hilt:javadoc-srcs", "//java/dagger/producers:producers-srcs", "//java/dagger/spi:spi-srcs", ], android_api_level = 29, # TODO(ronshapiro): figure out how to specify the version number for release builds doctitle = "Dagger Dependency Injection API", exclude_packages = [ "dagger.hilt.android.internal", "dagger.hilt.internal", "dagger.internal", "dagger.producers.internal", "dagger.producers.monitoring.internal", ], root_packages = ["dagger"], deps = [ "//java/dagger:core", "//java/dagger/android", "//java/dagger/android/support", "//java/dagger/grpc/server", "//java/dagger/grpc/server/processor", "//java/dagger/hilt/android:artifact-lib", "//java/dagger/hilt/android/testing:artifact-lib", "//java/dagger/producers", "//java/dagger/spi", ], )javadoc_library同上出自于@google_bazel_common//tools/javadoc:javadoc.bzl,可自行查看,目的用于生成所有的功能整合过后的java文档
name:文档名称user-docs.jar testonly = 1:表示仅用于测试,不会发布到生产的二进制文件中 srcs:这里表示生成的文件路径 android_api_level = 29:android api版本为29 doctitle = “Dagger Dependency Injection API”:文档标题 exclude_packages:这里的文件内容被排除在外,都是内部文件,不对外宣传 root_packages:根目录 deps :当前生成文档名称所需要的依赖
根目录下的BUILD(总经理),相当于汇总所有分经理的工作,下面就是针对各个分经理分派任务(同时,也验证以上的叙述是否正确)
分经理们做了那些事情:
1.生成了dagger_with_compiler.jar,里面的内容是//java/dagger:core;并且给//java/dagger/internal/codegen:component-codegen插件提供依赖
2.生成了producers_with_compiler.jar,里面的内容包括//java/dagger/producers和dagger_with_compiler.jar里面的内容
3.生成了android.jar内容://java/dagger/android,并且给//java/dagger/android/processor:plugin插件提供依赖
4.生成android-support.jar,包含android.jar和//java/dagger/android/support
5.shaded_android_processor.jar和shaded_grpc_server_processor.jar干啥的,咱也不知道啊,咱也不敢问啊,到了再去看
6.生成了user-docs.jar,里面是Dagger依赖注入API文档信息(这个有点意思,回头我给个小案例可以对比当前的API)
那下面的工作基本上就围绕这些分经理工作了。
备注:以上的描述尽可能不动,哪怕解说有误(大胆猜想,然后验证)也会重新加括号备注说明