
在发表这篇文章之前,我解释了如何为一个单用户系统 在 NixOS 中安装和删除软件包。
但是,如果你正在供多个用户使用,有一个很好的方法来分别满足每个用户的需求。
在本指南中,我将指导你如何在 NixOS 上设置一个家庭管理员,以及如何使用它来安装软件包。
如果你是新读者,本系列中讨论的一些资源包括:
在本指南中,我将指导你通过 2 种方式来设置家庭管理员:
configuration.nix 文件中使用它)那么,让我们从独立方式开始。
如果你使用的是 NixOS 的稳定频道,你可以使用以下命令来配置家庭管理器:
nix-channel --add https://github.com/nix-community/home-manager/archive/release-22.11.tar.gz home-manager在编写本指南时,稳定版是 22.11。
而 如果你在一个不稳定的频道上,请使用以下命令:
nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager无论你使用稳定版还是不稳定版,下面的步骤都是一样的。
一旦完成,更新频道:
nix-channel --update最后,使用下面的命令来安装家庭管理员:
nix-shell '<home-manager>' -A install?️ 在安装时,可能会出现以下错误:

安装家庭管理员时出现构建错误
重新启动你的系统并再次使用安装命令,它将开始安装。
一旦完成,它将显示独立安装的家庭管理员的位置:

家庭管理器在NixOS中的位置
⚠️ 如果你选择将家庭管理员作为 NixOS 模块使用,你将需要 sudo 权限。
如果你在一个稳定的频道上(在写本文的时候,是 22.11),你可以使用下面的命令来添加家庭管理员的稳定频道:
sudo nix-channel --add https://github.com/nix-community/home-manager/archive/release-22.11.tar.gz home-manager而 如果你使用的是不稳定通道或主通道,则使用以下命令:
sudo nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager一旦你使用上面的任何一条命令完成了添加频道的工作,就用下面的方法更新频道:
sudo nix-channel --update接下来,用以下方法打开 configuration.nix 文件:
sudo nano /etc/nixos/configuration.nix并在 imports [] 中添加以下一行:
<home-manager/nixos>
将家庭管理员安装为 NixOS 模块
现在,跳到该行的末尾,在 } 前添加以下内容:
home-manager.users.{username} = { pkgs, ... }: {
home.packages = [ ] ;
};
NixOS 配置文件中的家庭管理员模块的格式
上面这一行是为了方便安装和删除软件包而添加的,我接下来会告诉你。
现在,保存修改并退出 Nano 文本编辑器。
接下来,重建配置,并做一个切换:
sudo nixos-rebuild switch但如果你使用的是稳定版,并使用上述命令,就会出现以下错误:
?️ 错误: 选项
home-manager.users.user.home.stateVersion 被使用但没有定义:

错误: 选项 已被使用但未被定义。
要解决这个问题,你必须在你的家庭管理器块中添加 home.stateVersion。
在写这篇文章时,我正在运行 22.11,所以整个家庭管理员块看起来像这样:
home-manager.users.{username} = { pkgs, ... }: {
home.stateVersion = "22.11";
home.packages = [ ] ;
};
如何解决 选项被使用但没有定义。
保存修改,按 Ctrl+O,按回车键和 Ctrl+X 退出 Nano 文本编辑器。
现在,试着重建配置并再次进行切换,应该可以解决问题。
现在你已经安装了家庭管理员,如何用它来安装软件包:
首先,用下面的方法打开配置文件:
nano /home/$USER/.config/nixpkgs/home.nix跳到行末,在 } 前添加以下代码块:
home.packages = [];现在,你所要做的就是在这两个大括号之间写上软件包的名称。
例如,如果我想安装 htop,我将得输入以下内容:
home.packages = [pkgs.htop];是的,你通常要在软件包的名称后面加上 pkgs.。
但是,如果你想在每次安装新包时不使用 pkgs.,可以改变代码块的语法,如图所示:
home.packages = with pkgs; [];而现在,你不再需要在每次安装时使用 pkgs.:
home.packages = with pkgs; [htop];例如,在这里,我想安装 htop、firefox和 libreoffice,所以我的 home 块会看起来像这样:

在 NixOS 上使用家庭管理员安装多个软件包
一旦你完成了添加你喜欢的软件包,保存配置文件并使用以下命令来安装软件包:
home-manager switch首先,用以下命令打开 configuration.nix 文件:
sudo nano /etc/nixos/configuration.nix在配置部分,我已经添加了家庭管理员块,所以剩下的就是在 home.packages = [ ]; 里面添加软件包的名称,格式如图所示:
home.packages = [ pkgs.package_name ] ;?我已经在上节提到软件包名称前你可以使用
pkgs. 。
例如,如果我想 安装 htop、Firefox 和 LibreOffice,那么我将添加:
pkgs.htop pkgs.firefox pkgs.libreoffice然后我的家庭管理员块会看起来像这样:

作为 NixOS 模块在家庭管理员中安装多个软件包
现在,保存修改并退出文本编辑器。
接下来,重建配置并使用以下命令进行切换:
sudo nixos-rebuild switch这是这样!软件包将很快被安装。
我认为你应该选择独立安装,因为你不需要使用超级用户的权限。另外,如果你运行一个有多个用户的系统,为不同的用户拥有不同的配置文件是相当方便的。
因此,除非你想用一个文件来实现各种目的,否则我认为没有其他理由使用模块选项。
就这样,我结束了 NixOS 的初学者系列。我希望它能给你一个足够好的平台来熟悉这个独特的 Linux 发行版。
? 你喜欢 NixOS 系列文章吗?对于 NixOS 的初学者,我们还有什么要介绍的吗?请提供你的宝贵意见。
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击