下个时代的开发工具-Nix:声明式的运行环境构建器、简单场景下的docker替身

本文涉及的产品
性能测试 PTS,5000VUM额度
可观测链路 OpenTelemetry 版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Nix 是一个独特的包管理工具和构建系统,采用声明式方法管理软件包和运行环境。它通过精确控制依赖关系和环境配置,确保软件的可重复性、隔离性和可追溯性。Nix 支持多语言开发环境,提供声明式配置、环境隔离、回滚与版本控制等核心功能,适用于复杂开发场景,有效解决依赖冲突和环境不一致问题。

个人的一点拙见 : 声明式范式会成为以后软件工程靠近应用侧主要的开发方式。比较典型的包括Docker,算是一个老前辈,晚一点在介绍。先来一个比较基础的,Nix

在开发的过程中,相信小伙伴们肯定用到一些环境管理的工具,用于维护某个工具的不同版本。当然也可以通过环境变量配置,但切换总是挺麻烦的。例如nvm管理不同的nodejs,miniconda管理不同的python版本,但切换过程中还是挺繁琐的,甚至遇到一些问题,在以前的文章介绍了一些情况,以及推荐用docker来解决,但docker也存在一定问题-就是需要虚拟化环境支持,在某些场景下可能就不适用了。

1. 简介

Nix 是一个独特的包管理工具和构建系统,它采用了一种声明式的方法来管理软件包和运行环境。与传统的包管理器(如 aptyumbrew 等)不同,Nix 提供了一种以函数式编程理念为基础的机制,通过精确控制依赖关系和环境配置,确保软件的可重复性、隔离性和可追溯性。

什么是声明式运行环境?

声明式运行环境的核心思想是:用户描述“是什么”而不是“如何实现”。用户只需要定义软件环境的期望状态,Nix 会自动处理如何实现这一状态。这种方式与传统的命令式操作不同,后者要求用户逐步指定每个步骤。

2. Nix 的特点

2.1 声明式配置

Nix 使用声明式配置文件(如 configuration.nixshell.nix)定义系统或项目环境。通过这个文件,用户可以描述需要的软件包、依赖和设置。Nix 会解析并自动创建与配置相符的环境。这样可以极大减少配置出错的风险。

2.2 软件环境隔离

Nix 使用独立的构建环境,确保每个软件包及其依赖的隔离性。每个软件包安装在一个唯一的目录下(通常是 /nix/store),不会相互干扰。这种隔离避免了传统包管理器常见的“依赖地狱”(dependency hell)问题,即不同软件包对同一依赖库的版本冲突问题。

2.3 可重复性和可再现性

Nix 保证了构建过程的可重复性,即同样的配置和依赖会始终生成相同的结果。对于开发者来说,无论是搭建本地开发环境,还是在 CI 系统中进行部署测试,都可以确保在不同机器上生成一致的结果。

2.4 回滚与历史追踪

Nix 支持环境的版本控制功能,允许用户轻松回滚到以前的配置。无论是单个软件包的更新出错,还是系统配置有问题,用户都可以快速恢复到之前的版本。

2.5 多用户安全支持

Nix 设计为多用户友好,每个用户可以独立管理自己的环境,而不干扰系统或其他用户。它确保了每个用户的权限隔离,不必担心用户安装的软件包会影响到全局环境。

3. Nix 的核心优势

Nix 工具的设计和理念解决了传统包管理器的一些核心问题,尤其在复杂开发环境中的一些痛点:

3.1 依赖管理

传统包管理器有时会导致依赖冲突或版本不一致的情况。Nix 的唯一性和隔离机制确保了不同版本的依赖库可以共存,避免了依赖冲突。

3.2 可重复性构建

现代软件开发常常依赖于特定版本的工具链和依赖。Nix 提供了一种稳定的、可再现的构建环境,特别适合对环境要求苛刻的项目,如科研、数据分析或大型应用的持续集成系统。

3.3 灵活性

Nix 支持 Linux、macOS,甚至 Windows(通过 WSL),因此它适用于不同操作系统的开发人员。此外,它支持在多个项目中创建不同的隔离开发环境,使得同一台机器上能够并行开发多个具有不同依赖的项目。

4. 安装与使用

4.1 Nix 安装

在 Linux 和 macOS 上安装 Nix 非常简单。只需运行以下命令:

curl -L https://nixos.org/nix/install | sh

该命令会自动下载并安装 Nix,并将必要的环境变量配置到用户的 shell 中。安装完成后,可以通过重启终端来激活 Nix。

4.2 初始化开发环境

安装完成后,可以通过 nix-shell 来创建和使用隔离的开发环境。我们通过创建一个 shell.nix 文件来定义环境配置:

{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  buildInputs = [
    pkgs.git
    pkgs.nodejs
  ];
}

在该文件中,定义了两个依赖:gitnodejs。使用 nix-shell 进入环境:

nix-shell

此时,用户的 shell 环境将会包含指定的依赖工具,无需在系统全局安装。

4.3 管理软件包

Nix 可以轻松安装软件包,类似于其他包管理器的工作方式。例如,安装 vim

nix-env -iA nixpkgs.vim

其中 -iA 参数表示直接从 Nix 软件包仓库中安装特定的包。

要查看当前安装的软件包列表,可以使用:

nix-env -q

4.4 升级和回滚

Nix 允许随时升级环境中的软件包:

nix-env --upgrade

如果升级后环境出现问题,可以使用回滚命令恢复到之前的版本:

nix-env --rollback

4.5 使用 NixOS 系统

除了 Nix 包管理器,Nix 还拥有一个基于 Nix 工具的操作系统——NixOS。这是一个完全声明式的 Linux 发行版,用户可以通过配置文件精确描述操作系统的各个组件和服务。

5. Nix 与 NVM、Pyenv、Miniconda 的对比

在开发过程中,很多开发者会使用工具来管理特定编程语言的版本和依赖,如 nvm 用于 Node.js、pyenvminiconda 用于 Python。Nix 虽然是一个通用的包管理器,但在管理多语言开发环境时也具备类似功能。下面,我们对比一下 Nix 与这些工具的异同。

5.1 Nix 与 NVM(Node.js 版本管理)

相同点

  • 版本管理nvm 专注于管理不同版本的 Node.js,而 Nix 也可以通过声明式配置来指定需要的 Node.js 版本。两者都允许用户为不同项目指定不同的 Node.js 版本,从而避免版本冲突。
  • 隔离环境nvm 为每个 Node.js 版本提供了隔离的环境,用户可以在不同项目中使用不同版本的 Node.js,Nix 也具备同样的能力,可以通过 nix-shell 为每个项目创建独立的开发环境。

不同点

  • 通用性nvm 仅用于 Node.js 的版本管理,而 Nix 是通用的包管理器,除了 Node.js,Nix 还能管理各种其他编程语言及其依赖,甚至操作系统级别的工具和库。
  • 声明式 vs 命令式nvm 的配置是命令式的,用户需要手动执行命令来安装和切换 Node.js 版本。而 Nix 采用声明式配置文件(如 shell.nix),用户只需定义所需的 Node.js 版本,Nix 会自动处理其安装和依赖。

5.2 Nix 与 Pyenv、Miniconda(Python 版本管理)

Pyenv 对比

相同点
  • Python 版本管理pyenv 允许用户安装和切换多个 Python 版本。Nix 同样可以管理 Python 及其版本,通过 nix-shell 可以轻松为每个项目提供指定版本的 Python 环境。
  • 隔离环境pyenv 通过虚拟环境(如 pyenv-virtualenv 插件)提供 Python 依赖的隔离。Nix 提供类似的功能,在每个 nix-shell 会话中隔离不同项目的依赖,避免 Python 包冲突。
不同点
  • 通用性pyenv 只能管理 Python 版本,而 Nix 是通用的包管理器,可以同时管理多种语言及其依赖。
  • 声明式配置pyenv 的版本管理需要手动切换,而 Nix 通过声明式文件(如 shell.nix)定义 Python 版本和依赖,提供更自动化的方式,并且无需手动操作即可确保环境一致性。
  • 系统依赖管理pyenv 只关注 Python 语言本身,而 Nix 可以同时管理 Python 及其依赖的系统库(如 C/C++ 库)。

Miniconda 对比

相同点
  • 虚拟环境与依赖管理miniconda 和 Nix 都可以为不同项目创建独立的虚拟环境,安装特定版本的 Python 及依赖包。两者都可以为每个项目创建隔离的运行环境,确保环境的干净和一致性。
  • 跨平台支持miniconda 和 Nix 都支持在不同平台(如 Linux、macOS)上运行,并能跨平台管理软件包和环境。
不同点
  • 包管理模型miniconda 使用的是 conda 包管理系统,而 Nix 使用自己独特的 nixpkgs 仓库。conda 偏向于数据科学和科学计算,提供了很多专门为 Python 用户优化的库。Nix 则是通用的包管理器,涵盖了广泛的软件包和语言工具。
  • 声明式 vs 命令式minicondaconda 的使用是命令式的,用户需要手动创建环境并安装软件包。而 Nix 提供声明式的方式,可以通过配置文件完整定义项目的依赖和环境,使其更加易于自动化和复现。
  • 系统依赖的处理:与 Nix 一样,conda 也能处理某些系统级依赖,但是 Nix 在此方面更加灵活和广泛,支持几乎所有操作系统层面的库和工具。

5.3 总结对比

工具 支持语言 包管理方式 环境隔离 声明式配置 回滚与版本控制 系统依赖管理
Nix 多语言 声明式
NVM Node.js 命令式
Pyenv Python 命令式 是(插件)
Miniconda Python 命令式 部分支持

从上表可以看出,Nix 的核心优势在于它的通用性声明式配置。无论是对多语言开发环境的支持,还是对于依赖包和系统库的全面管理,Nix 提供了比专用语言管理器(如 nvmpyenv)更加广泛的功能。同时,Nix 的声明式模型确保了环境的一致性和可再现性,使其在复杂项目中具备独特的优势。

5. 结语

Nix 是一个功能强大且灵活的包管理器,它通过声明式的配置、隔离环境和版本控制等功能,为开发者提供了极大的便利和灵活性。无论是在单独管理软件包,还是为项目创建隔离开发环境,Nix 都提供了一种可重复、可靠且高效的解决方案。对于那些希望彻底摆脱依赖地狱和环境不一致问题的开发者,Nix 无疑是一个值得深入研究和使用的工具。

Nix算是docker的另一个简单化选择,当然它也可以通过docker安装和使用。声明式对于前段应该不陌生,那就是HTML,它就是一个声明式的界面定义,由浏览器根据它渲染,每次刷新都保持了很好的一致性。而这种一致性、可复现、易阅读将来肯定会取代很多编程工作,只需要描述一个清晰的需求,具体的实现让runtime去实现 - 满足这个需求即可,而不要教他一步步该怎么做-出了异常怎么恢复。

相关文章
|
4天前
|
SQL 人工智能 安全
【灵码助力安全1】——利用通义灵码辅助快速代码审计的最佳实践
本文介绍了作者在数据安全比赛中遇到的一个开源框架的代码审计过程。作者使用了多种工具,特别是“通义灵码”,帮助发现了多个高危漏洞,包括路径遍历、文件上传、目录删除、SQL注入和XSS漏洞。文章详细描述了如何利用这些工具进行漏洞定位和验证,并分享了使用“通义灵码”的心得和体验。最后,作者总结了AI在代码审计中的优势和不足,并展望了未来的发展方向。
|
13天前
|
存储 弹性计算 人工智能
阿里云Alex Chen:普惠计算服务,助力企业创新
本文整理自阿里云弹性计算产品线、存储产品线产品负责人陈起鲲(Alex Chen)在2024云栖大会「弹性计算专场-普惠计算服务,助力企业创新」中的分享。在演讲中,他分享了阿里云弹性计算,如何帮助千行百业的客户在多样化的业务环境和不同的计算能力需求下,实现了成本降低和效率提升的实际案例。同时,基于全面升级的CIPU2.0技术,弹性计算全线产品的性能、稳定性等关键指标得到了全面升级。此外,他还宣布了弹性计算包括:通用计算、加速计算和容器计算的全新产品家族,旨在加速AI与云计算的融合,推动客户的业务创新。
|
11天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
18天前
|
存储 人工智能 缓存
AI助理直击要害,从繁复中提炼精华——使用CDN加速访问OSS存储的图片
本案例介绍如何利用AI助理快速实现OSS存储的图片接入CDN,以加速图片访问。通过AI助理提炼关键操作步骤,避免在复杂文档中寻找解决方案。主要步骤包括开通CDN、添加加速域名、配置CNAME等。实测显示,接入CDN后图片加载时间显著缩短,验证了加速效果。此方法大幅提高了操作效率,降低了学习成本。
2993 10
|
13天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1578 12
|
5天前
|
人工智能 关系型数据库 Serverless
1024,致开发者们——希望和你一起用技术人独有的方式,庆祝你的主场
阿里云开发者社区推出“1024·云上见”程序员节专题活动,包括云上实操、开发者测评和征文三个分会场,提供14个实操活动、3个解决方案、3 个产品方案的测评及征文比赛,旨在帮助开发者提升技能、分享经验,共筑技术梦想。
752 100
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
18天前
|
人工智能 Serverless API
AI助理精准匹配,为您推荐方案——如何快速在网站上增加一个AI助手
通过向AI助理提问的方式,生成一个技术方案:在网站上增加一个AI助手,提供7*24的全天候服务,即时回答用户的问题和解决他们可能遇到的问题,无需等待人工客服上班,显著提升用户体验。
1494 9
|
6天前
|
SQL 存储 人工智能
【产品升级】Dataphin V4.3重大升级:AI“弄潮儿”,数据资产智能化
DataAgent如何助理业务和研发成为业务参谋?如何快速低成本的创建行业数据分类标准?如何管控数据源表的访问权限?如何满足企业安全审计需求?
376 0
【产品升级】Dataphin V4.3重大升级:AI“弄潮儿”,数据资产智能化
|
3天前
|
人工智能 自然语言处理 程序员
提交通义灵码创新实践文章,重磅好礼只等你来!
通义灵码创新实践征集赛正式开启,发布征文有机会获得重磅好礼+流量福利,快来参加吧!
210 7