2015-10-26 26 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>