Facebook Buck 是个构建系统,以Google的内部构建系统 blaze为模型,它是由前Google, 现Facebook工程师开发并在Github上面开源的。
Buck当前只支持 Mac OS X 和 Linux,
Buck环境配置
有两种方式可以下载Buck:
Homebrew方式
OS X系统使用Homebrew方式安装Buck之前,需要首先确保安装了 XCode 和 Command Line Tool ,并更新到最新版本,接着在Terminal中执行如下命令即可:
$ brew update
$ brew tap facebook/fb
$ brew install --HEAD buck
这种方式走不通的话,建议尝试手动构建方式。
手动构建方式
手动构建就是从Buck源码进行编译安装,首先需要确保你的 OS X 满足以下条件:
- Oracle JDK 7
- Apache Ant 1.8 (or newer)
- Python 2.6 or 2.7
- Git
- C 编译器:gcc或者clang
在具备以上环境之后,就可以从Github上面检出Buck的源码然后进行编译安装了,在Terminal中执行如下命令:
$ git clone https://github.com/facebook/buck.git
$ cd buck
$ ant
$ ./bin/buck --help
其中Buck的源码比较大,压缩包接近200M,所以网络不佳的话git clone可能会等待很长时间。
验证
buck --help
如果一切正常的话,你将会在Terminal中得到如下日志信息:
buck build tool
usage:
buck [options]
buck command --help
buck command [command-options]
available commands:
audit lists the inputs for the specified target
build builds the specified target
clean deletes any generated files
fetch downloads remote resources to your local machine
install builds and installs an application
project generates project configuration files for an IDE
query provides facilities to query information about the target nodes graph
quickstart generates a default project directory
server query and control the http server
targets prints the list of buildable targets
test builds and runs the tests for the specified target
uninstall uninstalls an APK
options:
--help : Shows this screen and exits.
--version (-V) : Show version number.
安装 Watchman
Facebook 开源的一个文件监控服务,用来监视文件并且记录文件的改动情况,当文件变更它可以触发一些操作,例如执行一些命令等等。安装watchman,是为了避免Buck每次都去解析 build files,同时可以缓存其他一些东西,减少编译时间。Watchman安装很简单,脚本如下:
brew install watchman
使用
目前可以选择两种方式使用:
facebook原生使用方式
快速创建基于 Buck 构建的 Android 工程
使用touch .buckconfig && buck quickstart
命令可以快速创建一个Android工程,该命令执行过程中会要求你补全如下两个参数的值:
--dest-dir
:生成的Android工程的目录--android-sdk
:电脑上Android SDK的目录
Terminal 中执行的日志信息如下:
CJS@CJS-MacBook-Pro.local /Users/CJS $ touch .buckconfig && buck quickstart
Buck does not appear to have been built -- building Buck!
All done, continuing with build.
Using watchman.
Using buckd.
Enter the directory where you would like to create the project: /Users/CJS/Desktop/BuckDemo
Enter your Android SDK's location: /Users/CJS/Documents/Android/android-sdk/
Thanks for installing Buck!
In this quickstart project, the file apps/myapp/BUCK defines the build rules.
At this point, you should move into the project directory and try running:
buck build //apps/myapp:app
or:
buck build app
See .buckconfig for a full list of aliases.
If you have an Android device connected to your computer, you can also try:
buck install app
This information is located in the file README.md if you need to access it
later.
CJS@CJS-MacBook-Pro.local /Users/CJS $
生成的Android工程目录结构如下:
可以看到,每个目录下面都有一个BUCK配置文件,我们先预览下myapp下面的BUCK文件内容
android_binary(
name = 'app',
manifest = 'AndroidManifest.xml',
keystore = ':debug_keystore',
deps = [
'//java/com/example/activity:activity',
],
)
keystore(
name = 'debug_keystore',
store = 'debug.keystore',
properties = 'debug.keystore.properties',
)
project_config(
src_target = ':app',
)
进入到工程根目录,在Terminal中输入如下命令创建IntelliJ工程:
$ buck project --ide IntelliJ
日志记录如下,表明IntelliJ工程创建成功:
Using buckd.
Waiting for Watchman command [/usr/local/bin/watchman watch /Users/CJS/Desktop/BuckDemo/.]...
Timed out after 10000 ms waiting for Watchman command [/usr/local/bin/watchman watch /Users/CJS/Desktop/BuckDemo/.]. Disabling Watchman.
[-] PROCESSING BUCK FILES...FINISHED 0.3s
[+] GENERATING PROJECT...0.4s
Modified 8 IntelliJ project files.
:: Please resynchronize IntelliJ via File->Synchronize or Cmd-Opt-Y (Mac) or Ctrl-Alt-Y (PC/Linux)
=== Did you know ===
* You can run `buck project <target>` to generate a minimal project just for that target.
* This will make your IDE faster when working on large projects.
* See buck project --help for more info.
--=* Knowing is half the battle!
第三方 buck + gradle使用方式
结合”okbuck gradle plugin”(生成的脚本有时需要手动调整)混合使用,对Android gradle项目来说很方便,同时可以配合buck plugin for idea(安装直接在Android Studio中搜索插件即可,暂时还有些问题,需要手动调整)
OkBuck
基本配置
工程根目录的build.gradle
文件中加入配置:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.uber:okbuck:0.9.4'
}
}
apply plugin: 'com.uber.okbuck'
大部分情况下, 上述配置就完成了。OkBuck托管在jcenter,所以 jcenter()
必须加入到 buildscript
和 allprojects
的 repositories
列表中,
而且必须在 apply plugin
部分之前。
应用 OkBuck 插件之后,工程内将会产生两个 gradle task,okbuck
和 buckWrapper
okbuck
将会生成 BUCK 配置文件buckWrapper
buck wrapper 类似于 gradle wrapper, 利用它 OkBuck 可以进行更聪明地为我们服务
我们非常建议大家使用 buckWrapper
,即执行:./gradlew buckWrapper
。
可以执行 ./buckw targets
命令查看所有可以 build 的目标, 而生成的 .buckconfig.local
文件中会指定多个 alias, 例如 appDevDebug
,appProdRelease
,another-appDebug
等,根据它们可以确定 BUCK build 的命令,例如 ./buckw build appDevDebug
等。
自定义配置
okbuck {
buildToolVersion "24.0.2"
target "android-24"
linearAllocHardLimit = [
app: 16 * 1024 * 1024
]
primaryDexPatterns = [
app: [
'^com/uber/okbuck/example/AppShell^',
'^com/uber/okbuck/example/BuildConfig^',
'^android/support/multidex/',
'^com/facebook/buck/android/support/exopackage/',
'^com/github/promeg/xlog_android/lib/XLogConfig^',
'^com/squareup/leakcanary/LeakCanary^',
]
]
exopackage = [
appDebug: true
]
appLibDependencies = [
'appProd': [
'buck-android-support',
'com.android.support:multidex',
'libraries/javalibrary:main',
'libraries/common:paidRelease',
],
'appDev': [
'buck-android-support',
'com.android.support:multidex',
'libraries/javalibrary:main',
'libraries/common:freeDebug',
]
]
annotationProcessors = [
"local-apt-dependency": ['com.okbuck.apt.ExampleProcessor']
]
buckProjects = project.subprojects
extraBuckOpts = [
'appDebug', [
"binary": ["trim_resource_ids = True"]
]
]
wrapper {
repo = 'https://github.com/facebook/buck.git'
remove = ['.buckconfig.local', "**/BUCK"]
keep = [".okbuck/**/BUCK"]
}
}
详细解释
buildToolVersion
指定Android SDK Build-tools版本,默认为24.0.2
target
指定Android target sdk版本,可以运行<sdk home>/tools/android list targets --compact
获得,默认为android-24
linearAllocHardLimit
和primaryDexPatterns
都是map,用来配置BUCK multidex的 linearAllocHardLimit和primaryDexPatterns部分,更多详细关于multidex配置的说明,请参阅 multidex wiki, 如果未使用multidex(未在build.gradle
文件中开启),可以忽略这两个参数exopackage
和appLibDependencies
都是map,用来配置BUCK exopackage, 更多详细关于exopackage配置的说明,请参阅exopackage wiki, 如果未使用exopackage,可以忽略这三个参数annotationProcessors
用来声明项目中的注解处理器, key 为 module 路径, value 为注解处理器类的全名。buckProjects
用于控制哪些 module 将使用 BUCK 进行构建, 默认是项目中的所有 module- 上述配置 map 的 key, 可以按照以下规则设置:
- 指定 module 名字, 就能为所有的 flavor 以及 build type 设置, 例如:
app
- 指定 module 名字以及 flavor 名字, 就能为指定 flavor 的所有 build type 设置, 例如: ‘appDemo’
- 指定 module 名字以及 build type 的名字, 就能为指定 build type 的所有 flavor 设置, 例如: ‘appDebug’
- 指定 module 名字, flavor 名字以及 build type 的名字, 例如: ‘appDemoRelease’
问题
- buck编译的代码文件中含有中文,会有乱码问题。IDE已经设置为UTF-8也没解决, 但是通过strings.xml加载的中文是不会有问题的。
- 关于switch case 问题gradle最新插件已经解决这个问题,但是buck不能编译通过。
- 使用buck plugin for idea记得在
.buckconfig
or.buckconfig.local
中加入[httpserver] port = 0
开启ide中的buck开关
- 运行buck target 时如果提示找不到,可能buck for gradle plugin生成的脚本有问题记得手动修改。
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=14ykdvh0xcs9b