博文

tree命令获得文档结构

$ sudo apt-get install tree $ tree 得到当前目录下的文档结构 或者 $ tree 目录名 得到目录名下的文档结构 或者 $ tree -I ' node_modules|dist|*.mp3|*.jpg ' -f -I表示后面匹配上的内容不显示,-f表示每行显示完整的路径名 参考 生成项目结构图 - Tree命令的使用

获得pip中各个包的依赖关系

安装 $ pip install pipdeptree 运行得到结果 $ pipdeptree adium-theme-ubuntu==0.3.4 decorator==4.0.6 ipython==2.4.1 meld==3.14.2 pexpect==4.0.1 pipdeptree==0.12.1   - pip [required: >=6.0.0, installed: 10.0.1] ptyprocess==0.5 pycurl==7.43.0 pygobject==3.20.0 pylint==1.8.4   - astroid [required: >=1.6,<2.0, installed: 1.6.3]     - backports.functools-lru-cache [required: Any, installed: 1.5]     - enum34 [required: >=1.1.3, installed: 1.1.6]     - lazy-object-proxy [required: Any, installed: 1.3.1]     - singledispatch [required: Any, installed: 3.4.0.3]       - six [required: Any, installed: 1.11.0]     - six [required: Any, installed: 1.11.0]     - wrapt [required: Any, installed: 1.10.11]   - backports.functools-lru-cache [required: Any, installed: 1.5]   - configparser [required: Any, installed: 3.5.0]   - isort [required: >=4.2...

Bazel的扩展

Bazel的扩展代码都是写在.bzl文件中,然后通过load()函数在WORKSPACE文件或者BUILD文件中调用。比如: load ( "//build_tools/rules:maprule.bzl" , "maprule" ) 可以加载的扩展有:rule、函数、常量。在.bzl文件中 _ 开头的符号是私有的,不能被别的文件load。目前所有的.bzl文件都是可见的,不需要额外的export_files操作。 .bzl文件都是由Skylark语言所写的,这是一个类Python的语言,不过有些地方与python稍有不同。我们无需研究特别深入,不过这个文档 Skylark简介 推荐看下。 Macro和Rule 这是bazel的扩展中非常重要的两个概念,这里会做个大体的介绍,下面有细节介绍。 一个 macro 是指一个rule的实例化,也就是说在macro中会调用一些rule来做事情。当一个BUILD文件里面很多内容具有重复性和复杂性的时候,就可以使用macro来做代码的重复使用的简化。 rule 比macro要强大的多,它可以深入到bazel的内部并且完全控制正在发生的事情。比如可以传递信息到其他的rule中。 总的来说:如果你想重复使用简单的逻辑,那么就使用macro。如果macro变得非常复杂,那么就推荐将其变成一个rule。比如对一个新的编程语言的支持,就是通过rule来实现的。不过rule只是给高级用户使用的,期待绝大多数的用户永远不会需要写一个rule,而只是load和call已经存在的rule就够了。 Macro细节 创建macro macro没有别的功能,只是用来做封装和方便代码重用。正如其名,这其实是个宏,只在bazel的load阶段完成之前存在,load完成之后macro就不村子了,bazel只会看到这些宏所创建的rules。 native rules(也就是不需要load()语句加载的rules)可以通过 native   模块来调用,比如: def my_macro ( name , visibility = None ): native . cc_library ( name = name , srcs...

Bazel生成Python的部署文件

https://groups.google.com/forum/#!topic/bazel-discuss/42QRn8qU0eo 我们已经知道,对于:  Java/Scala/Groovy 在Bazel中可以使用target_name_deploy.jar来生成部署文件 C++/D/Rust/Go 在Bazel中可以生成静态的二进制文件 Python 那么对于Python语言,bazel可以使用下面这个工程来支持生成par文件(see github.com/google/subpar ) Subpar 这个是用来在Bazel中协助生成python可执行文件的一个项目。不过并不是Google的一个官方产品。 由于这个项目也是由Bazel来维护的,所以可以直接使用git_repository()来添加到本地WORKSPACE中索引使用: git_repository( name = " subpar " , remote = " https://github.com/google/subpar " , tag = " 1.0.0 " , ) 然后可以在BUILD文件中添加load()以及调用par_binary()来完成target的定义: load( " @subpar//:subpar.bzl " , " par_binary " ) par_binary( name = ' foo ' , srcs = [ ' foo.py ' , ' bar.py ' ], deps = [ ' //baz:some_py_lib ' ], data = [ ' quux.dat ' ], ) 不过如果在已有的BUILD中已有,py_binary()而且不想注释掉的话。需要做如下修改: py_binary( name = ' foo ' , # 已有py_binary()的定义和命名 src...

Bazel公共的函数规则

common-definitions 不管是写WORKSPACE,BUILD或者其他文件,都要遵循一些Bazel的规则,有些规则是bazel内置的函数使用说明,有的规则是一些语法分析用到的。 所有build rule的公共属性 只列举了部分 features rule中规定的package级别可使用的features列表,默认是空。目前还没搞懂具体是指什么。 data List of  labels ; optional :表示这个rule在运行时所需的文件列表。 visibility List of  labels ; optional; default  default_visibility  from  package  if specified, else private 定义了这个rule是否可以被别的package中的rule所使用。 有5种形式的label可以使用: 1、 ["//visibility:public"] : Anyone can use this rule 2、 ["//visibility:private"] : Only rules in this package can use this rule.  3、 ["//some/package:__pkg__", "//other/package:__pkg__"] : Only rules in  some/package  and  other/package  (defined in  some/package/BUILD and  other/package/BUILD ) have access to this rule. 必须是规定的package下面的BUILD文件中的rule才有权限使用 4、 ["//project:__subpackages__", "//other:__subpackages__"] : Only rules in packages  project  or  other  or in one of ...

Bazel的用户手册

手册 https://docs.bazel.build/versions/master/user-manual.html 运行Bazel命令,需要去workspace的根目录或者它的子目录下。然后输入bazel即可。 下面列举一些用到命令: build :build所指示的target clean :删除输出文件以及可选停止服务 help :打印command的help信息 info :显示bazel服务运行时的信息 fetch :获取某个target的所有外部依赖 query :执行依赖图的查询 run :运行指定的target shutdown :停止Bazel服务 test :build以及test指定的target version :打印Bazel的版本号 具体获得更多帮助信息: bazel help <command> Prints help and options for <command>. bazel help startup_options Options for the JVM hosting Bazel. bazel help target-syntax Explains the syntax for specifying targets. bazel help info-keys Displays a list of keys used by the info command. 命令行参考 https://docs.bazel.build/versions/master/command-line-reference.html bazel [<startup options>] <command> [<args>] or bazel [<startup options>] <command> [<args>] -- [<target patterns>] 选项语法: 传递参数值 -...

Bazel BUILD文件的编写

除了公共部分BUILD文件可以使用的规则外,还有一些与语言相关的build rule https://docs.bazel.build/versions/master/be/overview.html 这里根据不同的语言,来写整理。 Java Bin rules java_binary java_binary( name ,  deps ,  srcs ,  data ,  resources ,  args ,  classpath_resources ,  compatible_with ,  create_executable ,  deploy_manifest_lines ,  deprecation ,  distribs ,  features ,  javacopts ,  jvm_flags ,  launcher ,  licenses ,  main_class ,  output_licenses ,  plugins ,  resource_jars ,  resource_strip_prefix ,  restricted_to ,  runtime_deps ,  stamp ,  tags ,  testonly ,  toolchains ,  use_testrunner ,  visibility ) build一个java的jar文件,并且套上一个shell的脚本来辅助运行。 隐式的输出target: name.jar name-src.jar name_deploy.jar:这个比较特殊,必须显式的build才会生成,比如 bazel build //package:target_deploy.jar name_deploy-src.jar Lib rules java_import java_import( name ,  deps ,  dat...