我目前正在使用ant来构建Android项目,但它并没有为大型项目削减它,并且维护不同的可交付成果正变得很痛苦.
我正在关注的两个替代方案是Facebook的Buck(http://facebook.github.io/buck/)和谷歌支持Android工作室的Gradle(http://tools.android.com/tech-docs/new- build-system/user-guide).
除了尝试一下并阅读他们的报道之外,我想请问Stackoverflow人员您的建议.最好是如果你已经使用了一段时间的工具,还有Buck的奖励积分,因为它没有得到那么多的报道.
重点是
我也对其他选择持开放态度.你有什么建议,为什么?
Buck听起来像iOS和Android项目的一个很好的工具,但我没有找到任何有关如何将它用于反应原生项目的信息.
更新
看起来有一些工作要做,但可能还不推荐.
https://github.com/facebook/nuclide/issues/31#issuecomment-164897170 https://github.com/facebook/buck/tree/master/test/com/facebook/buck/js
更新2
产品难点链接https://productpains.com/post/react-native/add-buck-as-a-build-option
我正在尝试使用BUCK和Realm pod.
我将我的buck文件设置为:
apple_pod_lib(
name = "Realm",
visibility = ["PUBLIC"],
exported_headers = glob([
"Realm/**/*.h",
"Realm/**/*.hpp",
]),
srcs = glob([
"Realm/**/.{m,mm,cpp}",
]),
)
apple_pod_lib(
name = "RealmSwift",
visibility = ["PUBLIC"],
swift_version = "4",
deps = [
"//Pods:Realm"
],
srcs = glob([
"RealmSwift/**/*.swift",
]),
)
Run Code Online (Sandbox Code Playgroud)
使用Airbnb的pod宏.
但是我无法构建我的项目,因为这失败了
In target '//Pods:Realm', 'Realm/history.hpp' maps to the following header files:
- /BuckSample/Pods/Realm/include/core/realm/sync/history.hpp
- /BuckSample/Pods/Realm/include/core/realm/history.hpp
Please rename one of them or export one of them to a different path.
Run Code Online (Sandbox Code Playgroud)
我也尝试手动指定要包含的文件和标题,从那些repos查看PodSpec,但我无法使它工作,因为我当时缺少一些文件,以便在Xcode中编译项目.
如何在Android Studio中使用Facebook Buck构建工具?
这个要求类似于android studio中的代码,但是通过命令行中的buck来构建.
我正在玩反应原生.我读了很多关于buckbuild系统的内容.现在我正在尝试连接这两个(为了充分发挥核素编辑器的潜力).
有没有人知道如何buckconfig为现有的反应原生项目生成文件?这是否可以自动实现?如果没有,是否有人有一个与buckbuild一起工作的项目并且反应原生?
我也很感激所有关于本地和buckbuild的反馈教程.
我尝试像往常一样更新 Homebrew。最近当我发出命令时brew update,出现以下错误:
错误:获取 /usr/local/Homebrew/Library/Taps/facebook/homebrew-fb 失败!
Tap 与Buck我开发所需的软件相关联。
我按照Buck官网的安装说明进一步排查了问题,再次发出命令:
% brew tap facebook/fb
==> Unshallowing facebook/fb
fatal: couldn't find remote ref refs/heads/master
Error: Failure while executing; `git fetch --unshallow` exited with 128.
Run Code Online (Sandbox Code Playgroud)
显然,Git 源有问题。我尝试“解锁”它:
% brew untap facebook/fb
Error: Refusing to untap facebook/fb because it contains the following installed formulae or casks:
buck
Run Code Online (Sandbox Code Playgroud)
没有运气。我该如何解决这个问题?
我无法理解集成测试如何与android运行.我浏览了文档并设置了示例项目,我可以成功运行测试.但是,我完全混淆了如何将各个部分放在一起为我自己的项目创建自己的测试.我已经完成了iOS的集成测试,我希望重用我编写的javascript文件进行测试,但是在示例应用程序中看起来他们制作了新的测试文件......?无论如何我会解释我可能有缺陷的理解,如果有人能帮我把各个部分放在一起,我会很感激.
我的理解如下:
1.调用集成测试的脚本,并通过检查是否安装了buck来启动:
set -e
which buck > /dev/null || {
echo "React Native uses the Buck build tool to run tests. Please install Buck: https://buckbuild.com/setup/install.html";
exit 1;
}
Run Code Online (Sandbox Code Playgroud)
2.脚本在build gradle中调用一些编译本机代码的方法.(不确定我的gradle脚本是否应该具有相同的实现或略微不同于此)
echo "Compiling native code..."
./gradlew :ReactAndroid:packageReactNdkLibsForBuck
Run Code Online (Sandbox Code Playgroud)
3.然后脚本构建一些testbundle,其中包括用户想要运行的所有测试.我不确定这些测试的位置.然后放置一些输出.
echo "Building JS bundle..."
node local-cli/cli.js bundle --platform android --dev true --entry-file ReactAndroid/src/androidTest/js/TestBundle.js --bundle-output ReactAndroid/src/androidTest/assets/AndroidTestBundle.js
Run Code Online (Sandbox Code Playgroud)
4.然后使用一些buck文件,加载依赖项并准备好,最后安装到设备上.不确定我是否需要依赖项或是否应该完全复制此文件.
echo "Installing test app on the device..."
buck fetch ReactAndroid/src/androidTest/buck-runner:instrumentation-tests
buck install ReactAndroid/src/androidTest/buck-runner:instrumentation-tests
echo "Running integration tests..."
adb shell am instrument -w com.facebook.react.tests/android.support.test.runner.AndroidJUnitRunner
Run Code Online (Sandbox Code Playgroud)
因此,你可以从我不那么精明的解释中猜出,我很困惑要复制哪些文件以获得最低限度的工作作为我自己的测试.非常感谢在这方面的任何建议或指导.参考我可能忽略的文档也没关系.大多数情况下,我会欣赏这些测试如何运行的一些流程,所以我可以实现一个非常简单的测试来扩展自己.(所以我应该复制哪些文件,我应该更改哪些文件等).
我将 Buck 用于我自己的 C++ 项目,但我依赖于使用 CMake 构建的第三方库。CMake 文件很复杂,因此我认为在 Buck 中重新创建他们的 CMake 文件是不切实际的。相反,我想从 Buck 调用 CMake。
从 Buck 调用 CMake 的最佳方式是什么?
我应该如何构建我的项目以最大程度地减少头痛?
我有一个由几个 BUCK 模块组成的项目。每个模块使用相同的注释处理器为每个注释类生成单个文件。为简单起见,对于每个带注释的类:
package com.myproject.module1;
@Marker
public class SomeFoo {
// ... code ...
}
Run Code Online (Sandbox Code Playgroud)
将在同一个包中生成一个类:
package com.myproject.module1;
@Generated
public class SomeFoo$$Marker {
// ... generated code ...
}
Run Code Online (Sandbox Code Playgroud)
假设我有两个这样的模块:module1和module2
最后,我有一个 module3依赖于上述两个模块的。
该模块包含另一个注释:
package com.myproject.module3;
@MarkerCollector
public class Bar {
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用相同的注释处理器(也可以是一个单独的处理器)来生成一个引用所有先前生成的文件的类(由于类标记为@Marker.
问题是注释处理器分别为每个模块运行,当在模块 3 中运行时,注释处理器不会“看到”其他模块中生成的文件。
我尝试使用注释处理器Filer创建一个资源文件并写入所有生成文件的类名,但是这个资源文件也是每个模块创建的。
聚合/访问来自不同模块的生成代码的最佳方法是什么?
我有一个genrule输出包含 C++ 标头的目录。我还有一个cxx_library使用genrule. 该字段headers看起来cxx_library像这样:
...
headers = [
':my-headers',
],
...
Run Code Online (Sandbox Code Playgroud)
问题是我的 C++ 源文件包含如下标头:
#include "my_header.h"
Run Code Online (Sandbox Code Playgroud)
但是 Buck 是这样准备暂存区的:
my-cxx-library#default,private-headers/out
Run Code Online (Sandbox Code Playgroud)
其中out包含我生成的标头的文件夹的别名。
因此,为了使用标头,我必须像这样包含它们:
#include "out/my_header.h"
Run Code Online (Sandbox Code Playgroud)
该库不是我自己的,所以我不想更改源代码。相反,我想使用类似 a 的东西subdir_glob来包含里面的所有内容:my-headers/out。
我试过这个:
...
headers = subdir_glob([
(':my-headers/out', '**/*.h'),
]),
...
Run Code Online (Sandbox Code Playgroud)
但是,似乎以这种方式完成后,字符串:my-headers不会解析为 的输出路径:my-headers。
Buck中是否有一个函数可以将规则扩展到其输出路径?