Change log
目录
[bazel]-导读
[bazel]-概念和术语
[bazel]-bazel的使用
[bazel]-tulsi的使用
[bazel]-如何编译
[bazel]-缓存
[bazel]-影响缓存命中的因素
[bazel]-优化
项目地址
Change log
2021-01-15:更新tulsi
官方的tulsi对Xcode支持有些问题。推荐使用bilibili修改后的tulsi。
地址:https://github.com/bilibili/tulsi
一.是什么
tulsi GitHub地址: https://github.com/bazelbuild/tulsi
tulsi使用: https://tulsi.bazel.build/docs/gettingstarted.html
tulsi使用Bazel的BUILD中的信息来生成Xcode Project.
注意.他只是用来帮我们生成Xcode Project文件的.
至于编译和签名都还是Bazel干的事.
二.安装
tulsi GitHub地址: https://github.com/bazelbuild/tulsi
step1: git clone https://github.com/bazelbuild/tulsi.git
step2: cd tulsi
step3: sh build_and_run.sh
三.怎么用
step1:
将前面编译生成的tulsi.app复制到GXBazelShell文件夹下的tools目录下
step2: Create a new Tulsi project
首先打开tulsi软件 -> Create New project
输入你app的名字.如universal
step3: Choose the WORKSPACE file
点击Workspace location右边的那一排灰字.
选择刚才创建的WORKSPACE文件.
step4:
这里是给项目中添加任何BUILD文件的位置,以及设置Bazel二进制文件的路径,该二进制文件将用于生成Xcode项目和编译.
现在我们要创建的是universal这个target的project.
所以应该选择universal目录下的BUILD文件.
注意:
这一步你可以指定使用的bazel的路径.
如上图.我指定的是/usr/local.....下的bazel.
但是这样的话.每个开发使用的bazel就可以能不统一.
(例如A开发安装的是0.15.2版本.B开发安装的是0.17.2版本.)
所以我们可以将bazel放在workspace目录下.并上传到git仓库里.
如下.我就将bazel放在了//:workspace/bin/bazel/0.17.2目录下了.
然后所有开发都必须将工程clone到同一目录下.(如/opt/bazel-workspace)
那么在创建tulsi配置文件的时候就可以将bazel的路径修改为/opt/bazel-workspace/bin/bazel/0.17.2/下的bazel了.
这样所有人都使用的是同一个bazel版本了.
这里我们可以再优化一下.
将/opt/bazel-workspace/bin/bazel/0.17.2/bazel-0.17.2..win-x86_64 做一个软链bazel-wrapper.放在workspace根目录下.
然后tulsi配置文件就将bazel的路径设置为/opt/bazel-workspace/bazel-wrapper.
以后你想升级bazel.就只需要更改bazel-wrapper的真实路径就可以了.就不用修改tulsi的配置文件了.
step5: shared options
默认即可
step6: Create project generator configs
点击顶部的configs选项
然后点击'+'号.会弹出如下弹窗
弹窗会让你选择存放路径.即存放生成的.tulsiproj文件的路径
step7: 选择该tulsiproj文件与哪个app关联
step8: 自定义配置configs 默认即可
step9: 选择target
step10: 给你的target取个名字.
step11.点击右下角的generate按钮.选择保存路径即可
step: over
至此大功告成.当你点击Generate后tulsi会自动帮你生成xcodeproj文件.然后帮你打开.如下
在这个project下.你的开发跟原来一模一样.
唯一的潜在区别就是当你点击run按钮的时候.
Xcode走的是Build Phases -> Run Script -> bazel_build.py这个脚本.
让bazel帮你编译.
优化
这里的universal.tulsi.tulsiproj其实就是个模板.
告诉tulsi怎么生成我们想要的xcodeproj文件.
所以这里的universal.xcodeproj应该加入到.gitignore文件里.
使用优化
每个人拉取你的工程时.都要用tulsi软件去生成这个.xcodeproj文件.
这样太麻烦了.
tulsi给我们提供了通过命令行来创建.xcodeproj文件的方式.
我们可以在根目录下创建build.sh脚本.
在这个脚本里调用tulsi的命令创建.xcodeproj文件
#!/bin/sh
set -e
echo "通过//universal/universal.tulsi.tulsiproj文件生成universal.xcodeproj文件"
./tools/Tulsi.app/Contents/MacOS/Tulsi -- genconfig --genconfig universal/universal.tulsi.tulsiproj:universal
这样当别人要运行你的项目时.
只需要两步
1.git clone你的仓库.
2,运行build.sh脚本.
遇到的bug:
问题一:版本选择错误
/opt/Mine/tulsi(master) » sh build_and_run.sh xxx@xxx
ERROR: /private/var/tmp/_bazel_xxx/ecd97368bb045b45661f8a6d7e6ead6a/external/local_config_xcode/BUILD:12:1: in xcode_config rule @local_config_xcode//:host_xcodes: --xcode_version=11.3.1 specified, but '11.3.1' is not an available Xcode version. available versions: [11.4.0.11E146]. If you believe you have '11.3.1' installed, try running "bazel shutdown", and then re-run your command.
ERROR: Analysis of target '//:tulsi' failed; build aborted: Analysis of target '@local_config_xcode//:host_xcodes' failed
INFO: Elapsed time: 0.061s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (1 packages loaded, 0 targets configured)
解决办法:
查看.bazelrc.发现这里设置的是11.3.1.将这里改成你的xcode版本即可。
cat .bazelrc
build --cpu=darwin_x86_64
build --apple_platform_type=macos
build --xcode_version=11.3.1 // 就是这行有问题
# Disable the Swift compilation worker when running integration tests, since it
# requires the protobuf dependency which is infeasible to get working on Bazel.
build --define=RULES_SWIFT_BUILD_DUMMY_WORKER=1
build --strategy=SwiftCompile=local
# Stop gap for https://github.com/bazelbuild/tulsi/issues/94.
# See also: https://github.com/bazelbuild/rules_apple/issues/456.
build "--host_force_python=PY2"
问题二:新添加的文件夹不显示
我在根目录添加了srcs文件夹。
并在srcs文件夹里添加了新的BUILD。
该BUILD也被其他BUILD依赖了。
但是使用tulsi构建出来的工程目录里却没有显示该路径。
解决:
如果你新添加了文件夹后需要修改universal.tulsi.tulsiproj文件。
将你新添加的文件夹添加进去。
1.打开之前创建的tulsi模版
2.打开之前创建的universal
3.勾选你新建的package
这里把他们勾选上。并save。重新构建project即可在xcode目录中显示了。
还有个前提是你新建的这个package必须有其他已经显示的package依赖他。否则他也不会显示。
下一篇:[bazel]-如何编译