#build-system #build #docker-build #docker #build-environment #package #build-script

bin+lib lal

严格的、语言无关的构建系统和依赖管理器

2 个稳定版本

使用旧的 Rust 2015

3.8.0 2017 年 11 月 26 日
3.7.0 2017 年 10 月 30 日

命令行工具 中排名第 2448

MIT 许可协议

200KB
3.5K SLoC

lal

build status coverage status crates status

严格的、语言无关的构建系统和依赖管理器。

  • 使用现有工具:使用 lal build 只会启动一个配置好的 docker 容器中的 BUILD 脚本。在你的构建环境中安装你想要的:cmake、autotools、cargo、go、python。
  • 缓存大型构建:发布构建的库,以便在依赖树中稍后使用。
  • 对环境和版本严格:使用 lal verify 确保所有依赖都使用相同的版本和相同的环境构建(并在构建之前运行)。
  • 基于现有包管理器思想构建:清单中的版本,首先获取依赖项,验证它们,然后按照你想要的方式构建,lal 在构建过程中自动生成锁定文件。
  • 透明使用 Docker 作为构建环境,具有可配置的挂载和查看使用的 docker run 命令的直接视图。使用 lal shelllal 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.jsonBUILD文件)。

构建问题

如果库无法构建,请通过运行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

影响

主要灵感来自 cargonpm。术语的实用参考: 你想编写一个包管理器(长读)。

依赖项

~16–26MB
~443K SLoC