C# 将数百个项目的二进制引用替换为NuGet引用

C# 将数百个项目的二进制引用替换为NuGet引用,c#,.net,visual-studio-2012,nuget,C#,.net,Visual Studio 2012,Nuget,考虑一个拥有大约150多个解决方案和800多个C#项目的大型现有代码库。许多是使用NUnit编写的单元测试。所有这些项目都引用签入的“lib”文件夹中的“nunit.framework.dll”。“lib”文件夹中还有许多第三方程序集,其中包含相应的NuGet软件包 我可以手动打开150多个解决方案,并将每个引用迁移到NuGet。然而,这被证明是乏味和容易出错的。我编写了一个C#console应用程序来解析csproj文件,并确定各个项目需要安装哪些包。所以我知道300多个项目需要安装NUnit

考虑一个拥有大约150多个解决方案和800多个C#项目的大型现有代码库。许多是使用NUnit编写的单元测试。所有这些项目都引用签入的“lib”文件夹中的“nunit.framework.dll”。“lib”文件夹中还有许多第三方程序集,其中包含相应的NuGet软件包

我可以手动打开150多个解决方案,并将每个引用迁移到NuGet。然而,这被证明是乏味和容易出错的。我编写了一个C#console应用程序来解析csproj文件,并确定各个项目需要安装哪些包。所以我知道300多个项目需要安装NUnit包


如何以编程方式在解决方案中自动安装程序包,并与Visual Studio 2013中手动安装程序包的行为完全相同?我到处寻找,只找到了一个,但是,它没有使用依赖项等执行完整安装。

创建一个
packages.config
文件,其中只包含NUnit软件包的条目
package.config
应该类似于此,检查包名、版本和目标信息是否正确

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="nunit.framework" version="2.6.3" targetFramework="net45" requireReinstallation="true" />
</packages>
packages.config应复制到所有项目文件夹;否则,如果您的项目将具有相同的引用,您可以选择添加packages.config作为链接

 <ItemGroup>
    <None Include="$(SolutionDir)packages.config">
       <Link>$(SolutionDir)packages.config</Link>
    </None>
  </ItemGroup>

您可以使用以下代码段:

Get-Project -All | foreach-object {IF (Get-Content $_.FullName | Select-String 'Reference Include="XXX"') {Install-Package XXX -ProjectName $_.FullName}}

用所需的包名替换
XXX
,并在Visual Studio中运行
Tools->NuGet-package-Manager->package-Manager-Console
中的代码段。

我假设在更新解决方案中的所有项目后,命令行
NuGet-update
将起作用,这一假设正确吗?我的假设不正确。由于还原的包已经是最新的,因此未修改项目文件。建议的过程似乎不太有效。调用
Update Package
不会将二进制引用更改为NuGet引用,如果不指定包id,则会将现有包升级为不兼容的版本。当使用
updatepackage-Reinstall-Safe
时,有时会删除包,并且项目不会编译。在其他情况下,该过程将因COM错误而失败。对于大型解决方案,此过程也需要很长时间;对于我的一些解决方案(经常失败或产生不正确的结果)。可能重复@bloudraak我即将开始一项类似的任务-您的控制台应用程序代码是否张贴在任何地方?起初我尝试了开箱即用,但后来我意识到“Reference Include=“XXX”'是csproj文件的内容。幸运的是,在我的情况下,它在所有地方都是相同的..\ProjName\ProjName,您需要\\而不是一个\如果在同一个结构中没有引用,很容易找到每个csproj中写的关于此引用的内容。这仍然需要几个调用。是的,它正在工作。祝我高兴。
update-package
Get-Project -All | foreach-object {IF (Get-Content $_.FullName | Select-String 'Reference Include="XXX"') {Install-Package XXX -ProjectName $_.FullName}}