2015-10-26 84 views
1

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

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

我试着暂时删除对该DLL的引用,并直接向我想要的版本添加引用,但问题在于它在许多项目中引用,为它们做这件事相当麻烦。

回答

0

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

+0

我试过了,只要不升级NuGet包,它就可以很好地工作。但是,当您升级它时,它将删除条件引用并添加一个无条件引用。 – EM0

+0

我试着给测试项目添加一个条件引用。它在NuGet软件包更新中幸存下来。在初始dll引用后我有了这个ItemGroup。 '<的ItemGroup条件= “存在时( 'C:\ TEMP \ ConditionalProjRefTest \ log4net.dll')”> <参考包含= “log4net的”> C:\ TEMP \ ConditionalProjRefTest \ log4net.dll ' – hsirah

+0

是的,但您是否也有NuGet参考?这需要有条件(Condition =“!Exists(...)”),否则会有重复。 – EM0

0

看起来可以在BeforeBuild步骤中通过删除现有的NuGet引用完成。这样,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>