猿问

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

我有两个 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 setup

tee plugin/mainapp/go.mod <<EOF >/dev/null

module example.com/mainapp


go 1.16

EOF

tee plugin/go.mod <<EOF >/dev/null

module example.com/plugin


go 1.16

EOF


# each contain minimal Go code

tee plugin/mainapp/main.go <<EOF >/dev/null

package main


import "fmt"


func main() {

    fmt.Println("Hello, World!")

}

EOF

tee plugin/main.go <<EOF >/dev/null

package plugin


import log


func 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 build

trace: sources at /nix/store/d5arinbiaspyjjc4ypk4h5dsjx22pcsf-mainapp-with-plugins-source

error: path '/nix/store/3b7djb5pr87zbscggsr7vnkriw3yp21x-mainapp-go-modules' is not valid

(如果你得到散列不匹配,只需用正确的散列更新薄片;我不太确定在存储库之外散布薄片时散列是否可重现。)


源目录(由跟踪显示)确实存在并且看起来不错。错误消息中给出的路径也存在并且包含modules.txt预期的内容。


在文件夹mainapp中,nix build确实运行成功,它构建了没有插件的应用程序。那么我对使路径无效的插件做了什么?


拉风的咖菲猫
浏览 83回答 1
1回答

米琪卡哇伊

原因是在这种情况下modules.txt,作为 vendoring 一部分生成的文件将在replace指令中包含 nix 存储路径。该vendor目录是一个固定的输出派生,因此不得依赖于任何其他派生。中的引用违反了这一点modules.txt。这只能通过将插件的源复制到sources派生中来解决 - 这样,replace路径可以是相对的,因此不会引用其他 nix 存储路径。
随时随地看视频慕课网APP

相关分类

Go
我要回答