博文

目前显示的是 五月, 2018的博文

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.5, installed: 4.3.4]     - futures [required: Any, installed: 3.2.0]     - futures [required:

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