gpt4 book ai didi

.net - 私有(private) NuGet 提要和 docker 缓存(Windows)

转载 作者:行者123 更新时间:2023-12-02 19:44:16 24 4
gpt4 key购买 nike

我目前正在尝试将 Docker 用于我们的构建过程,以便轻松地从任何开发人员机器/服务器重现构建结果。
复杂之处在于我有几个我的软件所依赖的私有(private)包,这需要我在恢复包之前为构建脚本设置一个变量。这反过来会导致 docker 不使用 nuget restore 步骤的缓存输出。
环境是 Windows Containers,.Net Framework 4.8 代码。
我的(简化的)Dockerfile:

# escape=`
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS dotnetbuild
RUN Invoke-WebRequest https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1 -OutFile installcredprovider.ps1; `
.\installcredprovider.ps1 -AddNetfx; `
del installcredprovider.ps1

WORKDIR C:/app

COPY ./*.sln .
COPY ./MyProject/*.csproj /MyProject/packages.config ./MyProject/
COPY ./nuget.config .

ARG PAT
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS "{`"endpointCredentials`": [{`"endpoint`":`"myfeed1.json`", `"username`":`"docker`", `"password`":`"${PAT}`"}, {`"endpoint`":`"myfeed2.json`", `"username`":`"docker`", `"password`":`"${PAT}`"}]}"

RUN nuget restore

COPY . .
RUN msbuild
理想情况下,我想防止每次项目构建时 nuget restore 下载所有包。
我最初的想法是首先恢复公共(public) nuget 包(这是大多数),然后在每个构建中恢复私有(private)包作为权衡:
RUN nuget restore 
COPY ./nuget.config .

ARG PAT
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS "{`"endpointCredentials`": [{`"endpoint`":`"myfeed1.json`", `"username`":`"docker`", `"password`":`"${PAT}`"}, {`"endpoint`":`"myfeed2.json`", `"username`":`"docker`", `"password`":`"${PAT}`"}]}"
RUN nuget restore
但是,第一个 nuget 命令找不到所有包,并给出错误,使 docker build 失败:
    Unable to find version '1.0.0.0' of package 'MyPrivatePackage'.
https://api.nuget.org/v3/index.json: Package 'MyPrivatePackage.1.0.0.0' is not found on source 'https://api.nuget.org/v3/index.json'.
我可以在主机上恢复包,并将包文件夹发送到 docker 上下文,但我试图避免在主机上安装除 Docker 之外的任何东西。
目前我已经实现了一个包含以下内容的批处理文件,并调用它来代替第一个 nuget restore 命令:
nuget.exe restore
exit 0
哪个有效,但我觉得这是一个相当肮脏的解决方案。
我正在寻找任何可以缓存 nuget 还原步骤而不会导致 docker 构建失败或在主机上安装 .net sdk 的想法。

最佳答案

执行两次 nuget restore对我来说似乎是最好的方法。正如您提到的,第一次执行将返回一个非零退出代码,因为私有(private)提要的恢复失败将导致 Docker 构建失败。当您希望退出代码为零时,各种 shell 中有一些技术可以补偿非零退出代码。这允许 Docker 构建继续进行,即使 nuget restore命令导致错误。
这些是如何在各种 shell 中完成此操作的示例:
Windows CMD 外壳

RUN nuget restore || ver>nul
电源外壳
RUN nuget restore; exit 0
重击
RUN dotnet restore || true

关于.net - 私有(private) NuGet 提要和 docker 缓存(Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64605054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com