为了账号安全,请及时绑定邮箱和手机立即绑定

在具有两个 Nix Flake 的设置中,其中一个为另一个应用程序提供插件如何解决?

在具有两个 Nix Flake 的设置中,其中一个为另一个应用程序提供插件如何解决?

Go
拉风的咖菲猫 2022-10-24 10:15:45
我有两个 Nix Flakes:一个包含一个应用程序,另一个包含该应用程序的插件。当我使用插件构建应用程序时,出现错误error: path '/nix/store/3b7djb5pr87zbscggsr7vnkriw3yp21x-mainapp-go-modules' is not valid我不知道这个错误意味着什么以及如何修复它,但我可以在 macOS 和 Linux 上重现它。有问题的路径是vendor第一步生成的目录buildGoModule。重现错误的最小设置需要一堆文件,因此我提供了一个带注释的 bash 脚本,您可以在空文件夹中执行该脚本来重新创建我的设置:#!/bin/bash# I have two flakes: the main application and a plugin.# the mainapp needs to be inside the plugin directory# so that nix doesn't complain about the path:mainapp# reference being outside the parent's root.mkdir -p plugin/mainapp# each is a go module with minimal setuptee plugin/mainapp/go.mod <<EOF >/dev/nullmodule example.com/mainappgo 1.16EOFtee plugin/go.mod <<EOF >/dev/nullmodule example.com/plugingo 1.16EOF# each contain minimal Go codetee plugin/mainapp/main.go <<EOF >/dev/nullpackage mainimport "fmt"func main() {    fmt.Println("Hello, World!")}EOFtee plugin/main.go <<EOF >/dev/nullpackage pluginimport logfunc init() {    fmt.Println("initializing plugin")}EOF# the mainapp is a flake that provides a function for building# the app, as well as a default package that is the app# without any plugins.tee plugin/mainapp/flake.nix <<'EOF' >/dev/null{  description = "main application";  inputs = {    nixpkgs.url = github:NixOS/nixpkgs/nixos-21.11;    flake-utils.url = github:numtide/flake-utils;  }; 您需要安装了 Flake 支持的 Nix 来重现错误。在plugin此脚本创建的文件夹中,执行$ nix buildtrace: sources at /nix/store/d5arinbiaspyjjc4ypk4h5dsjx22pcsf-mainapp-with-plugins-sourceerror: path '/nix/store/3b7djb5pr87zbscggsr7vnkriw3yp21x-mainapp-go-modules' is not valid(如果你得到散列不匹配,只需用正确的散列更新薄片;我不太确定在存储库之外散布薄片时散列是否可重现。)源目录(由跟踪显示)确实存在并且看起来不错。错误消息中给出的路径也存在并且包含modules.txt预期的内容。在文件夹mainapp中,nix build确实运行成功,它构建了没有插件的应用程序。那么我对使路径无效的插件做了什么?
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

原因是在这种情况下modules.txt,作为 vendoring 一部分生成的文件将在replace指令中包含 nix 存储路径。该vendor目录是一个固定的输出派生,因此不得依赖于任何其他派生。中的引用违反了这一点modules.txt

这只能通过将插件的源复制到sources派生中来解决 - 这样,replace路径可以是相对的,因此不会引用其他 nix 存储路径。


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信