在Visual Studio Code中应用Nix-Shell环境



许多开发人员在他们的工作站上遇到软件包地狱的问题。 经过几个月的实验,包括不同的语言和工具链,我安装了Elixir,Haskell-stack,Node.js / NVM和其他各种东西。 当您需要不同项目的同一软件包的不同版本时,最令人兴奋的事情发生。 人类已经发明了另一种解决方案,用于创建隔离的环境并在需要时进行切换。 我们正在使用NVM管理Node.js版本,使用Python Virtual Env选择Python填充版本,或者使用Docker在操作系统内部创建操作系统。 但是,没有一种解决方案能够满足我对隔离开发环境的所有要求。

引入管理隔离环境工具的要求


那是一个寒冷的秋天傍晚。 我坐在我的厨房里,想到了项目工作空间及其依赖关系的完美隔离。 实际上,我没有,但是该段应该有一个介绍。

之后,我为完美的隔离工具编写了以下标准:

  1. 应该涵盖不同的语言和程序包:不只是Node.js,Python或Haskell。
  2. 没有虚拟化。 我们对于这一切都还太年轻。 让我们节省时间。
  3. 所有工作区软件包都应易于删除。
  4. 所有工作区环境都应易于删除。
  5. 我的IDE应该使用所有这些东西,而不必从乌克兰喀尔巴阡山脉叫莫尔法尔斯(Molfars)。

我们需要一杯茶和Google,但首先要喝杯茶


我记得我曾经读过声明式包管理器,它可以产生一个隔离的环境并管理所有系统依赖项和Haskell项目依赖项。
五分钟的搜索时间,30分钟的阅读时间和1个小时的尝试时间让我发现当前所需的工具已足够。 我需要的只是爱。 别说了,这是另一首歌。 我只需要Nix。

让我们比较一下我上面根据实际Nix功能编写的要求。

  1. 与macOS兼容-是的。
  2. 涵盖不同的语言和软件包-是的。
  3. 没有虚拟化-真的没有虚拟化。
  4. 所有工作区软件包都应该易于删除-也许可以,但是我不知道如何。
  5. 我的IDE应该使用所有这些东西-不。 无法将Nix Env​​ironment集成到Visual Studio Code中。

扰流板警报
很久以前了。 秋天的夜晚很冷的时候,我告诉过你,你还记得吗? 但是今天是一个完全不同的夜晚。 秋天是温暖的秋天,我所有的问题都消失了。

救救自己 编写Visual Studio代码扩展


该扩展可帮助您将VS Code和Nix-shell集成在一起。
我懒得从头开始写这章,所以下面的文字是从我的扩展名中的官方README.md复制/粘贴的。

开始使用


  • 首先,您应该安装Nix软件包管理器
  • 重新启动VS Code以确保正确配置运行nix-shell的路径
  • 安装扩展
  • 在项目工作区根目录中创建nix env配置,例如default.nix
  • 打开命令托盘(Cmd / Ctrl + Shift + P),然后输入Select environment
  • 从nix虚拟环境列表中选择您要应用的环境

Haskell Project运行示例


要运行Haskell应用程序,您必须安装GHC编译器。 为了避免全局安装GHC并能够在主机中使用不同的编译器版本,请使用nix虚拟环境进行此操作。

NIX存储库中的GHC编译器示例(shell.nix):

{ nixpkgs ? import <nixpkgs> {} }: let inherit (nixpkgs) pkgs; inherit (pkgs) haskellPackages; haskellDeps = ps: with ps; [ base lens mtl random ]; ghc = pkgs.haskell.packages.ghc864.ghcWithPackages haskellDeps; nixPackages = [ ghc pkgs.gdb haskellPackages.cabal-install ]; in pkgs.stdenv.mkDerivation { name = "snadbox-haskell-workspace"; buildInputs = nixPackages; } 

现在,让我们尝试在Visual Studio Code中打开我们的项目。

图片

可以看到,IDE找不到编译器。 让我们打开shell.nix env。

图片

宾果! 现在一切都很好。

结论


我希望本文能为您带来一些新的想法,使您的生活更轻松,并在不混乱文件系统的情况下管理项目。

这种方法的好处是:

  • 所有包都位于单独的工作空间中,并且不会影响全局范围,因为您希望它隐式
  • 您的IDE可以看到所有工作区人员并按预期工作
  • 从不同机器上的配置文件进行简单的项目引导

在我们的世界中,没有什么是完美的:

  • 需要学习一种新语言来编写配置文件
  • Nix CLI选项没有明显的含义,并且在与CLI工具进行交互时,始终需要阅读命令帮助
  • 所有编程语言都有自己的东西来安装生态系统库。 像NPM,Cabal,Cargo,Pip等 而且,当您通过Nix安装此类软件包时,您可能会无法使用某些短绒,分析工具等产品而无法正常使用。

外部连结


Source: https://habr.com/ru/post/zh-CN474916/


All Articles