在开发中轻松覆盖NuGet DLL(VS 2015)

在开发中轻松覆盖NuGet DLL(VS 2015),dll,msbuild,nuget,visual-studio-2015,nuget-package,Dll,Msbuild,Nuget,Visual Studio 2015,Nuget Package,在VS 2015中,我们有3个包含C#项目的解决方案。其中一个创建一个NuGet包,另两个引用该NuGet包中的DLL。(DLL包含应用程序两部分之间的接口。)TeamCity build server构建DLL和NuGet包,并自动设置其版本 在开发中,我希望能够轻松地测试对DLL的更改,而无需提交更改并等待生成包。最好的方法是什么?理想情况下,我想说:如果C:\Build\My.dll存在,那么不管其版本如何,都使用它,否则使用MyDLL numget包的version 1.2.3.4。有没

在VS 2015中,我们有3个包含C#项目的解决方案。其中一个创建一个NuGet包,另两个引用该NuGet包中的DLL。(DLL包含应用程序两部分之间的接口。)TeamCity build server构建DLL和NuGet包,并自动设置其版本

在开发中,我希望能够轻松地测试对DLL的更改,而无需提交更改并等待生成包。最好的方法是什么?理想情况下,我想说:如果
C:\Build\My.dll
存在,那么不管其版本如何,都使用它,否则使用
MyDLL numget包的
version 1.2.3.4
。有没有办法指定它并让它在NuGet升级中“生存”下来


我尝试暂时删除对该DLL的引用,并直接添加对所需版本的引用,但问题是,许多项目中都引用了该DLL,对所有项目执行此操作相当麻烦。

您可以在csproj文件中使用条件引用来实现此目的。查看此MSDN链接了解更多信息:

看起来可以通过删除现有的NuGet引用在BeforeBuild步骤中完成。这样,NuGet引用项本身是不变的,可以在升级期间由NuGet自由替换,但在构建我的DLL版本时(如果存在的话)会被使用

无论版本如何,删除引用也需要稍加修改

  <Target Name="BeforeBuild">
    <!-- Override NuGet package with a local copy in dev, if available -->
    <PropertyGroup>
        <ReplacementLocalDllPath>Some\Path\My.dll</ReplacementLocalDllPath>
    </PropertyGroup>
    <ItemGroup Condition="Exists($(ReplacementLocalDllPath))">
      <!-- Remove any version of the DLL to be replaced -->
      <ReferenceToBeRemoved Include="@(Reference)" Condition="$([System.String]::Copy(&quot;%(Reference.Filename)&quot;).StartsWith('My'))" />
      <Reference Remove="@(ReferenceToBeRemoved)" />
      <!-- Add the local DLL, ignoring its version -->
      <Reference Include="My, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
        <SpecificVersion>False</SpecificVersion>
        <HintPath>$(ReplacementLocalDllPath)</HintPath>
      </Reference>
    </ItemGroup>
  </Target>

Some\Path\My.dll
假的
$(ReplacementLocalDllPath)

我试过了,只要不升级NuGet软件包,效果就很好。但是,当您升级它时,它会删除条件引用并添加一个无条件引用。它在NuGet软件包更新中幸存了下来。在初始dll引用之后,我有了这个项目组<代码>C:\Temp\ConditionalProjRefTest\log4net.dll
是的,但是您是否也有NuGet参考?这也需要是有条件的(Condition=“!Exists(…)”),否则会有重复项。是。我也有NuGet参考资料。下面是相关部分:
。\packages\log4net.2.0.3\lib\net40 full\log4net.dll True C:\Temp\ConditionalProjRefTest\log4net.dll
为了添加到前面的注释中,我最初参考了log4net包2.0.0,并将其更新为log4net 2.0.3