前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

Buck

作者头像
用户3004328
发布2018-09-06 17:17:21
2.1K0
发布2018-09-06 17:17:21
举报
文章被收录于专栏:增长技术增长技术增长技术

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Buck环境配置
    • Homebrew方式
      • 手动构建方式
      • 使用
        • facebook原生使用方式
          • 第三方 buck + gradle使用方式
          • OkBuck
            • 基本配置
              • 自定义配置
                • 详细解释
                  • 问题
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档