我正在尝试使用 nix 来构建 dotnet (sdk 5) 项目。
配置类似于
stdenv.mkDerivation {
# builder = "${bash}/bin/bash";
# args = [ ./builder.sh ];
name = "mypackage";
src = ./.;
HOME = "/tmp/test-home";
DOTNET_CLI_TELEMETRY_OPTOUT = 1;
nativeBuildInputs = [ nodejs ];
buildInputs = [ dotnet openssl cacert ];
configurePhase = ''
export HOME=$PWD/home
runHook preConfigure
dotnet nuget list source
dotnet nuget locals all --list
dotnet restore
runHook postConfigure
'';
buildPhase = ''
export DOTNET_CLI_TELEMETRY_OPTOUT=1
export DOTNET_NOLOGO=1
${dotnet}/bin/dotnet publish ProjectDirectory --self-contained -r linux-x64 -c Release
'';
installPhase = ''
mkdir -p $out/
'';
};
for 参数中的HOME
属性stdenv.mkDerivation
仅适用于 nix-shell。由于 nix-shell 将继承 normal $HOME
,我需要设置$HOME
到另一个空目录来模仿构建阶段的行为。
手动使用
nix-shell
和运行时,它工作正常。dotnet restore
使用时
nix-build
,构建失败,运行时出现以下错误dotnet restore
注册来源:
- nuget.org [已启用] https://api.nuget.org/v3/index.json http-cache: /build/PROJECTNAME/home/.local/share/NuGet/v3-cache global-packages: /build/PROJECTNAME /home/.nuget/packages/ temp: /build/NuGetScratch plugins-cache: /build/PROJECTNAME/home/.local/share/NuGet/plugins-cache 正在确定要恢复的项目... /nix/store/fvfyn01fjmawvyn7vlhhrgkzyy6321wl-dotnet -sdk-5.0.202/sdk/5.0.202/NuGet.targets(131,5):错误:无法加载源https://api.nuget.org/v3/index.json的服务索引. [/build/PROJECTNAME/PET-CT-machine-service.sln] /nix/store/fvfyn01fjmawvyn7vlhhrgkzyy6321wl-dotnet-sdk-5.0.202/sdk/5.0.202/NuGet.targets(131,5):错误:名称或服务未知 (api.nuget.org:443) [/build/PROJECTNAME/PET-CT-machine-service.sln] /nix/store/fvfyn01fjmawvyn7vlhhrgkzyy6321wl-dotnet-sdk-5.0.202/sdk/5.0.202/NuGet .targets(131,5):错误:名称或服务未知 [/build/tomopioneer/PET-CT-machine-service.sln]
手动设置nix-build
和nix-shell --pure
何时设置有什么区别?HOME
通过从 github NixOS/nixpkgs 存储库读取代码,似乎有几个 dotnet 包正在nuget
手动使用并dotnet restore
与本地源一起使用。那有必要吗?
我对 api.nuget.org 进行了更多测试。
运行curl https://api.nuget.org/v3/index.json -v
,我得到:
- 直接在 nixos 终端下运行时工作正常
- 工作正常
nix-shell --pure
- 中的错误
nix-build
,curl: (6) Could not resolve host: api.nuget.org