2 个稳定版本
使用旧的 Rust 2015
3.8.0 | 2017 年 11 月 26 日 |
---|---|
3.7.0 | 2017 年 10 月 30 日 |
在 命令行工具 中排名第 2448
200KB
3.5K SLoC
lal
严格的、语言无关的构建系统和依赖管理器。
- 使用现有工具:使用
lal build
只会启动一个配置好的 docker 容器中的BUILD
脚本。在你的构建环境中安装你想要的:cmake、autotools、cargo、go、python。 - 缓存大型构建:发布构建的库,以便在依赖树中稍后使用。
- 对环境和版本严格:使用
lal verify
确保所有依赖都使用相同的版本和相同的环境构建(并在构建之前运行)。 - 基于现有包管理器思想构建:清单中的版本,首先获取依赖项,验证它们,然后按照你想要的方式构建,lal 在构建过程中自动生成锁定文件。
- 透明使用 Docker 作为构建环境,具有可配置的挂载和查看使用的 docker run 命令的直接视图。使用
lal shell
或lal script
提供了额外的简单方法来使用构建环境。
概念
我们需要一个简单的依赖管理器,它以存储后端和构建环境为核心思想。对于我们的 C++ 代码库,严格的版本控制和一致的构建环境是最重要的特性,我们已经有了 docker 和 artifactory 来处理其他部分,但是将来可以实现其他存储后端。
命令行 规范 包含了 lal
所做的详细概述。
展示
关于 lal 内部通常如何使用的一些简短的 ascii 图像
设置
目前需要跨团队设置几个组件。拿一杯 ☕
先决条件(开发者)
你需要 docker(最低版本 1.12),登录到具有访问相关配置文件中 docker 图像的组。Linux >= 4.4.0 是主要目标,但 Mac 也正在逐步实现。
先决条件(运维)
一组在相关配置文件中概述的 docker 图像,所有图像都已构建并包含 lal
用户,可供登录的开发者使用(见下文)
CI配置用于构建和上传master版本,具体内容如下。
同一配置文件中配置的后端,与lal一起分发给开发者。目前,这仅支持artifactory。
构建
使用rust从源代码安装,设置自动完成,并选择你的站点配置。
git clone [email protected]:lalbuild/lal.git && cd lal
cargo install
echo "source $PWD/lal.complete.sh" >> ~/.bash_completion
lal configure configs/demo.json
如果你想要将这些静态二进制文件发布给开发者,你可以在CI上通过clux/muslrust构建lal。这样开发者就无需安装rust,如果你使用upgrade
功能,还可以设置自动升级。
使用方法
创建新组件
创建git仓库,使用lal初始化,然后更新依赖并验证其能否构建。
lal init xenial # create manifest for a xenial component
git add .lal/
git commit -m "init newcomponent"
# add some dependencies to manifest (if you have a storage backend)
lal update gtest --save-dev
lal update libwebsockets --save
# create source and iterate until `lal build` passes
# later..
git commit -a -m "inital working version"
git push -u origin master
注意,第一次lal build
将会调用lal env update
来确保你有构建环境。
创建新版本
设计用于在向master推送时由CI处理(理想情况下通过验证合并)。CI应创建你的数字标签并将构建输出上传到artifactory。有关完整信息,请参阅规范。
Docker镜像
构建和shell命令将在配置的镜像上使用docker run
。我们要求docker镜像的唯一条件是添加了lal
用户。
通常,这足以在docker镜像中满足要求
RUN useradd -ms /bin/bash lal -G sudo && \
echo "%sudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
VOLUME ["/home/lal/volume"]
请注意,不需要使用sudo
,但有时很方便。
我们将在容器内部使用此用户来运行构建脚本。默认情况下,如果主机用户的ID是1000:1000,则效果最佳,如果不是,lal将创建一个略微修改的镜像,以匹配主机系统的用户ID和组ID。
这是一次性操作,并且这是一个比docker usernamespaces(目前与像host networking这样的功能不兼容)更通用的解决方案。
开发
准备好lal的rust文档。
要在lal
上修改,请按照正常的安装程序进行,但迭代构建非发布构建。在开发过程中,我们不使用--release
。因此,为了方便,你应该通过ln -sf $PWD/target/debug/lal /usr/local/bin/lal
来链接lal
。
当进行更改时
cargo build
lal subcommand ..args # check that your thing is good
cargo test # write tests
提交前的良好实践(非强制性)
cargo fmt # requires `cargo install rustfmt` and $HOME/.cargo/bin on $PATH
rustup run nighthly cargo clippy # requires nightly install of clippy
请注意,如果你在你的lal配置中设置了rust环境,实际上可以执行lal build lal
(这将使用提供的manifest.json
和BUILD
文件)。
构建问题
如果库无法构建,请通过运行rustup update stable
来升级rustc
。
- 缺少ssl:安装
libssl-dev
的发行版等效版本,然后cargo clean
- 致命错误:找不到'openssl/hmac.h'文件。如果你在GNU/Linux发行版(如Ubuntu)上,请安装
libssl-dev
。如果你在OSX上,请安装openssl并检查你的OpenSSL配置
brew install openssl
export OPENSSL_INCLUDE_DIR=`brew --prefix openssl`/include
export OPENSSL_LIB_DIR=`brew --prefix openssl`/lib
export DEP_OPENSSL_INCLUDE=`brew --prefix openssl`/include
运行时问题
SSL证书
如果SSL证书丢失或位于非标准位置,则执行对等验证的SSL证书查找可能会失败。搜索是通过openssl-probe crate进行的。
尽管现在可能不再需要,但您也可以通过显式指向证书来自己覆盖搜索
# OSX
export SSL_CERT_FILE=/usr/local/etc/openssl/cert.pem
# CentOS
export SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt
应将其放入您的 ~/.bashrc
或 ~/.bash_profile
文件中,因为 lal
在每次运行时都会读取它。请注意,对于大多数现代 Linux 发行版,正常位置是 /etc/ssl/certs/ca-certificates.crt
。
Docker权限拒绝
您需要执行过 docker login
,并且您的用户必须由负责人添加到 dockerhub 上的正确组中,您才能拉取构建环境。
日志记录
可以通过在子命令之前使用标志进行配置
lal fetch # normal output
lal -v fetch # debug output
lal -vv fetch # all output
影响
主要灵感来自 cargo 和 npm。术语的实用参考: 你想编写一个包管理器(长读)。
依赖项
~16–26MB
~443K SLoC