Buck

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 满足以下条件:

在具备以上环境之后,就可以从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() 必须加入到 buildscriptallprojectsrepositories 列表中, 而且必须在 apply plugin 部分之前。

应用 OkBuck 插件之后,工程内将会产生两个 gradle task,okbuckbuckWrapper

  • okbuck 将会生成 BUCK 配置文件
  • buckWrapper buck wrapper 类似于 gradle wrapper, 利用它 OkBuck 可以进行更聪明地为我们服务

我们非常建议大家使用 buckWrapper,即执行:./gradlew buckWrapper

可以执行 ./buckw targets 命令查看所有可以 build 的目标, 而生成的 .buckconfig.local 文件中会指定多个 alias, 例如 appDevDebugappProdReleaseanother-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
  • linearAllocHardLimitprimaryDexPatterns都是map,用来配置BUCK multidex的 linearAllocHardLimit和primaryDexPatterns部分,更多详细关于multidex配置的说明,请参阅 multidex wiki, 如果未使用multidex(未在build.gradle文件中开启),可以忽略这两个参数
  • exopackageappLibDependencies都是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’

问题

  1. buck编译的代码文件中含有中文,会有乱码问题。IDE已经设置为UTF-8也没解决, 但是通过strings.xml加载的中文是不会有问题的。
  2. 关于switch case 问题gradle最新插件已经解决这个问题,但是buck不能编译通过。
  3. 使用buck plugin for idea记得在.buckconfig or .buckconfig.local中加入 [httpserver] port = 0 开启ide中的buck开关
  4. 运行buck target 时如果提示找不到,可能buck for gradle plugin生成的脚本有问题记得手动修改。

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=14ykdvh0xcs9b

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • App Intro相关

    ##How to use Add this to your build.gradle:

    用户3004328
  • Android 相机功能模块相关库

    Android’s video recording APIs are very difficult to figure out, especially sinc...

    用户3004328
  • ConcurrentModificationException

    用户3004328
  • VS2017开发Linux平台上的程序

    重装系统后安装VS2015时卡住了,于是试试看VS2017怎样,听说还支持调Linux。发现VS2017跟12/13/15又有了新的飞跃,竟然支持模块化下载,对...

    战神伽罗
  • CephFS 介绍及使用经验分享

    消息: Client name failing to respond to cache pressure

    Lucien168
  • 开发模型的演化

    中间的“开发过程”开始很简单,只是硬件的一个配置。但这个配置越来越多,当这个配置多到难以理解时,就变成魔法了。这个魔法威力强大,但是神秘,且不可控。人们面对旺盛...

    ThoughtWorks
  • MySQL编码引发的两个问题 原

    先讲一下写该文章的原因,首先,工作中又遇到一条很熟悉的MySQL报错信息 Cause: java.sql.SQLException: Incorrect str...

    阿dai学长
  • 手动搭建apache james邮件服务器,实现邮件功能

    最近一直在搞邮件这块,本来我们邮件发送是用的腾讯免费的企业邮箱,邮件功能没有问题,但是由于邮件的限制,如下: ? 这些限制导致我们的部分客户是收不到邮件的,哪怕...

    风间影月
  • MySQL字符集详解

      在使用MySQL时要注意6个需要编码的地方:系统的编码、客户端、服务端、库、表、列。字符集编码不仅影响数据存储,还影响client程序和数据库之间的交互.在...

    changxin7
  • 一文彻底搞懂 HTTPS 的工作原理!

    当你打开浏览器,访问某个网站,如果网址旁有个小锁,代表访问的网址是安全的,反之不安全。当我们没有看到那个小锁的小图标的时候,需要提高警惕,不要随意输入个人重要的...

    杰哥的IT之旅

扫码关注云+社区

领取腾讯云代金券