恢复 nuget 包的最佳方法是什么?
What is the best way to restore nuget packages?
我有一个使用自定义 nuget 包源的解决方案。现在我在位于我的解决方案文件附近的 Nuget.config
文件中指定它们(以便从源代码管理中检出):
|- MySoulution.sln
|- MyProjFolder
|- .nuget
|- Nuget.exe
|- Nuget.config
|- Nuget.targets
这在从 VisualStudio 构建解决方案时效果很好。它设法读取此 nuget.config
文件并成功恢复所有包。
现在我正在将我的解决方案配置为从 TeamCity 构建。所以我添加了项目配置和一个构建步骤来构建它。但默认情况下,TeamCity 不会恢复 nuget 包。所以我添加了一个单独的 Nuget installer
构建步骤,为我的解决方案运行 nuget(特定版本)恢复。但问题是它似乎没有从解决方案文件旁边的 .nuget
文件夹中的 Nuget.config
文件中看到我的自定义 nuget 包源。
我看到两种可能的方法来克服这个问题:
- 在
Nuget installer
构建步骤中配置我的自定义包源。
- 在构建机器上的 AppData 文件夹中的
Nuget.config
中配置我的自定义包源。
我不喜欢这两种方法,因为它们没有为我提供从 TeamCity 和 VisualStudio 构建的单一配置。
总而言之,问题是:我如何配置我的自定义包源,以便它们在 TeamCity 和 VisualStudio 中都可见,而不需要我在不同的地方多次配置它们?
how do I configure my custom package sources so that they would be visible both from TeamCity and VisualStudio without requiring me to configure them several times in different places?
如您所知,如果您不想在不同地方多次配置自定义 nuget 源,您可以在 NuGet.config 中设置自定义 nuget 源并将其添加到源代码管理。所以你的问题的关键是为什么 NuGet 不尊重解决方案文件旁边的 .nuget 文件夹中的 Nuget.config 文件中的自定义 nuget 包源。
正如我的评论,如果您使用的是 NuGet 2.7 或更高版本并且有一个解决方案仍然配置为 MSBuild 集成恢复,您可能在解决方案的 .nuget 中有一个旧版本的 nuget.exe文件夹。这将导致构建失败并出现错误,指出您尚未同意恢复包。
为避免此问题,建议将任何使用 MSBuild 集成还原的项目迁移到使用 NuGet 2.7 及更高版本的 自动还原 功能,您可以按照 the process 如下:
关闭Visual Studio以避免文件潜在的文件锁定和冲突。
如果使用 TFS:
从解决方案的 .nuget 文件夹中删除 nuget.exe 和 NuGet.targets,并从解决方案工作区中删除这些文件。
保留 Nuget.Config 和 disableSourceControlIntegration 设置,如使用 Team Foundation 版本控制省略包中所述。
如果不使用 TFS:
从解决方案和解决方案工作区中删除 .nuget 文件夹。
编辑解决方案中的每个项目文件,删除元素,并删除对 NuGet.targets 文件的所有引用。这些设置通常如下所示:
之后将 NuGet.config 放在具有自定义 NuGet 源的解决方案文件旁边:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<solution>
<add key="disableSourceControlIntegration" value="true" />
</solution>
<packageSources>
<add key="CustomSource" value="http://CustomSource/nuget" />
</packageSources>
<packageRestore>
<add key="enabled" value="True" />
</packageRestore>
</configuration>
现在,在 NuGet 安装程序步骤中,现在有一个“Package Sources”字段,您可以填写该字段以使团队城市使用自定义提要:
您可以参考此文档NuGet Package Restore with TeamCity了解更多详情。
此外,我们还可以specify custom feed in the NuGet.targets.nuget文件夹下的文件(我还没验证):
<ItemGroup Condition=" '$(PackageSources)' == '' ">
<PackageSource Include="https://nuget.org/api/v2/" />
<PackageSource Include="\MyShare" />
<PackageSource Include="http://MyServer/" />
</ItemGroup>
我有一个使用自定义 nuget 包源的解决方案。现在我在位于我的解决方案文件附近的 Nuget.config
文件中指定它们(以便从源代码管理中检出):
|- MySoulution.sln
|- MyProjFolder
|- .nuget
|- Nuget.exe
|- Nuget.config
|- Nuget.targets
这在从 VisualStudio 构建解决方案时效果很好。它设法读取此 nuget.config
文件并成功恢复所有包。
现在我正在将我的解决方案配置为从 TeamCity 构建。所以我添加了项目配置和一个构建步骤来构建它。但默认情况下,TeamCity 不会恢复 nuget 包。所以我添加了一个单独的 Nuget installer
构建步骤,为我的解决方案运行 nuget(特定版本)恢复。但问题是它似乎没有从解决方案文件旁边的 .nuget
文件夹中的 Nuget.config
文件中看到我的自定义 nuget 包源。
我看到两种可能的方法来克服这个问题:
- 在
Nuget installer
构建步骤中配置我的自定义包源。 - 在构建机器上的 AppData 文件夹中的
Nuget.config
中配置我的自定义包源。
我不喜欢这两种方法,因为它们没有为我提供从 TeamCity 和 VisualStudio 构建的单一配置。
总而言之,问题是:我如何配置我的自定义包源,以便它们在 TeamCity 和 VisualStudio 中都可见,而不需要我在不同的地方多次配置它们?
how do I configure my custom package sources so that they would be visible both from TeamCity and VisualStudio without requiring me to configure them several times in different places?
如您所知,如果您不想在不同地方多次配置自定义 nuget 源,您可以在 NuGet.config 中设置自定义 nuget 源并将其添加到源代码管理。所以你的问题的关键是为什么 NuGet 不尊重解决方案文件旁边的 .nuget 文件夹中的 Nuget.config 文件中的自定义 nuget 包源。
正如我的评论,如果您使用的是 NuGet 2.7 或更高版本并且有一个解决方案仍然配置为 MSBuild 集成恢复,您可能在解决方案的 .nuget 中有一个旧版本的 nuget.exe文件夹。这将导致构建失败并出现错误,指出您尚未同意恢复包。 为避免此问题,建议将任何使用 MSBuild 集成还原的项目迁移到使用 NuGet 2.7 及更高版本的 自动还原 功能,您可以按照 the process 如下:
关闭Visual Studio以避免文件潜在的文件锁定和冲突。
如果使用 TFS: 从解决方案的 .nuget 文件夹中删除 nuget.exe 和 NuGet.targets,并从解决方案工作区中删除这些文件。 保留 Nuget.Config 和 disableSourceControlIntegration 设置,如使用 Team Foundation 版本控制省略包中所述。
如果不使用 TFS: 从解决方案和解决方案工作区中删除 .nuget 文件夹。
编辑解决方案中的每个项目文件,删除元素,并删除对 NuGet.targets 文件的所有引用。这些设置通常如下所示:
之后将 NuGet.config 放在具有自定义 NuGet 源的解决方案文件旁边:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<solution>
<add key="disableSourceControlIntegration" value="true" />
</solution>
<packageSources>
<add key="CustomSource" value="http://CustomSource/nuget" />
</packageSources>
<packageRestore>
<add key="enabled" value="True" />
</packageRestore>
</configuration>
现在,在 NuGet 安装程序步骤中,现在有一个“Package Sources”字段,您可以填写该字段以使团队城市使用自定义提要:
您可以参考此文档NuGet Package Restore with TeamCity了解更多详情。
此外,我们还可以specify custom feed in the NuGet.targets.nuget文件夹下的文件(我还没验证):
<ItemGroup Condition=" '$(PackageSources)' == '' ">
<PackageSource Include="https://nuget.org/api/v2/" />
<PackageSource Include="\MyShare" />
<PackageSource Include="http://MyServer/" />
</ItemGroup>