Docker Azure devops:错误NU1101:找不到包xxx。源中不存在具有此id的包:nuget.org

Docker Azure devops:错误NU1101:找不到包xxx。源中不存在具有此id的包:nuget.org,docker,.net-core,azure-devops,nuget,Docker,.net Core,Azure Devops,Nuget,我有一个包裹我推到一个私人的nuget提要。然后,其他一些项目引用了这些包。所有这些都很好,除非我指定了一个通配符,该通配符仅在vs中有效,但显然在通过azure devops构建进行恢复时无效: 这项工作: <PackageReference Include="MyLibPackage" Version="1.0.0.114" /> azure devops中还原任务运行的dockerfile代码片段: # Install the Credential Provider to c

我有一个包裹我推到一个私人的nuget提要。然后,其他一些项目引用了这些包。所有这些都很好,除非我指定了一个通配符,该通配符仅在vs中有效,但显然在通过azure devops构建进行恢复时无效:

这项工作:

<PackageReference Include="MyLibPackage" Version="1.0.0.114" />
azure devops中还原任务运行的dockerfile代码片段:

# Install the Credential Provider to configure the access
RUN wget -qO- https://raw.githubusercontent.com/Microsoft/artifacts-credprovider/master/helpers/installcredprovider.sh | bash

# Configure the environment variables
ENV NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED true
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS "{\"endpointCredentials\": [{\"endpoint\":\"$feed\", \"password\":\"$pat\"}]}"

WORKDIR /src

COPY ["MyProject/MyProject.csproj", "MyProject/"]

RUN dotnet restore -s "$feed" "MyProject/MyProject.csproj"

我建议使用正常的问题解决技巧,消除不必要的复杂因素,以找出问题的根本原因。在您的情况下,将docker排除在外,并使用Azure DevOps内置功能进行恢复和构建。但是,在这种情况下,它可能会掩盖问题,因为NuGet任务允许您指定源提要,而该提要不会出现在任何NuGet.config文件中(该任务将使用源创建一个临时NuGet.config文件)。如果你不知道,我不喜欢用Docker来构建。这是一项运行服务的伟大技术,但我看到太多人在无法让构建工具在容器中正常工作时,会损失数小时或数天的工作效率

无论如何,由于错误消息中给出的源列表只包含nuget.org,这意味着您的repo中没有列出您的私有提要的nuget.config文件。如果您使用Visual Studio的工具->选项->nuget->源添加了您的私有提要,那么这只会修改您的用户配置文件nuget.config。这意味着它只在您的计算机上工作,其他计算机上不工作。您需要创建一个nuget.config并将其提交到repo中,以便CI计算机能够使用它。使用
dotnet new nugetconfig
将为您提供一个良好的模板

Azure devops:错误NU1101:找不到包xxx。源中不存在具有此id的包:nuget.org

我对Docker没有太多经验,我不确定这个问题是来自Docker容器还是dotnet还原本身

但既然你在评论中说:

基本上,除了一个硬版本号之外,所有的操作都失败了

因此,我想提供一个解决方法来解决此问题,您可以检查它是否适用于您:

由于我们必须使用硬版本号,我们可以再添加一个命令将包更新为最新版本,命令行如下所示:

RUN dotnet add package MyLibPackage -s "$feed"
并在项目文件所在的dockerfile中设置WORKDIR

@Elger Mensonides,感谢Elger对正确命令行的贡献

如果我们没有在命令行中指定版本,它会将最新的包添加到项目中

查看文档以了解一些详细信息


希望这能有所帮助。

如果您查看dockerfile,您会看到我正在传递提要和个人访问令牌,并使用它来执行dotnet还原,而且由于指定了通配符,它也不起作用。我认为nuget.exe和dotnet restore的行为可能会有所不同。拥有一个自包含的构建是imo的发展方向,因为我可以随时随地构建它,也在azure devops之外。在
dotnet restore-s$feed
命令中使用会覆盖nuget.config文件中提供的任何源。问题标题中的错误消息仅列出nuget.org,这表明未使用命令行中使用的源。不知道为什么。但是如果你把源代码放在nuget.config中,它仍然会帮助其他克隆你的repo的开发者。还可以看看其他人遇到类似问题并设法解决的问题:当指定显式包版本时,还原在docker生成中运行,但不适用于始终最新的版本范围?@JoshGust是的,这是正确的。使用通配符时,这是一个完全的生成失败吗?我知道nuget并行检查所有源,但只有在所有源都没有找到匹配项时,它才会失败。@JoshGust不幸的是,它找不到任何包。只有一个源代码和一个私有库,我只想要最新的。一系列
1.*
是否会改变行为?谢谢,在对Dockerfile进行了一些调整后,这是有效的。非常感谢。不过,这仍然是一个解决办法。dotnet add语句错误,应运行dotnet add package MyLibPackage-s“$feed”,并在项目文件所在的dockerfile中设置WORKDIR。@Elgermensonies,感谢您的共享。我真的是docker的新手,我可能需要学习它。我已经在我的回答中更新了它。顺便说一句,如果它有助于你解决问题,你可以在得到更好的解决方案之前接受它作为答案,这样它可以帮助其他遇到同样问题的社区成员,我们可以存档此线程,谢谢。是的,docker是一个相当陡峭的学习曲线,但现在我不知道没有它怎么办。我接受了这个答案,但对此有所保留。Nuget是MS堆栈中剩下的真正糟糕的东西之一。
RUN dotnet add package MyLibPackage -s "$feed"