2017-07-10 31 views
4

我想同時在我的項目(A)和一個相關的Nuget包(B)中工作,而不需要在每次更改時都釋放nuget包。在Debug和Nuget中使用項目參考

在構建Debug時,是否可以從解決方案(A)中執行項目引用Nuget項目(B)。當構建版本使用Source的Nuget包時?

回答

2

一種方法是手動編輯csproj文件。 如果您當前所引用的NuGet包,你將不得不在像這樣的csproj文件的一部分:

.... 
<ItemGroup> 
    <Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"> 
    <HintPath>..\packages\log4net.2.0.8\lib\net45-full\log4net.dll</HintPath> 
    <Private>True</Private> 
    </Reference> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    <Reference Include="System.Xml.Linq" /> 
    <Reference Include="System.Data.DataSetExtensions" /> 
    <Reference Include="Microsoft.CSharp" /> 
    <Reference Include="System.Data" /> 
    <Reference Include="System.Xml" /> 
</ItemGroup> 
.... 

在這個例子中,使用log4net的。對於NuGet包,公鑰標記,版本等是不同的。 ,您可以在不改變:

<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <Reference Include="log4net"> 
     <HintPath>Debug\log4net.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    </ItemGroup> 
    <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    <Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"> 
     <HintPath>..\packages\log4net.2.0.8\lib\net45-full\log4net.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    </ItemGroup> 

ItemGroup元素的Condition屬性正在做調試和發佈的工作。

+0

得好好的,唯一的問題是留下,如果我需要一個包的版本更新後編輯的csproj。 – medokin

+0

在我們使用VS2012的環境中,它並不總是正確的。所以我們每次都仔細檢查它。 –

3

是否有可能在構建Debug時從Solution(A)中執行項目引用Nuget項目(B)。當構建版本使用Source的Nuget包時?

當然,但有一些限制,你需要知道。

首先,所述NuGet包的ID應該從參考項目的名稱不同,否則,從的NuGet參考將替換項目參考(例如,TestProjectReferenceForDebug是項目引用的名稱,如果您想同時使用項目參考和NuGet包,則不能使用此項目直接創建NuGet包,因此我創建了具有不同名稱的同一項目以創建NuGet包「TestNuGetForRelease」):

enter image description here

,你應該在ItemGroup元素使用Condition屬性,否則將出現「TestProjectReferenceForDebug」之間不明確的引用和「TestNuGetForRelease」,所以我們需要ItemGroup元素

<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU'"> 
    <Reference Include="TestNuGetForRelease, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" > 
     <HintPath>..\packages\TestNuGetForRelease.1.0.0\lib\net462\TestNuGetForRelease.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    </ItemGroup> 
    <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU'"> 
    <ProjectReference Include="..\TestProjectReferenceForDebug\TestProjectReferenceForDebug.csproj"> 
     <Project>{90424b17-2231-4d7d-997b-608115d9f4d9}</Project> 
     <Name>TestProjectReferenceForDebug</Name> 
    </ProjectReference> 
    </ItemGroup> 

添加Condition屬性,經過我們與debugrelease添加在ItemGroup元素的Condition屬性,我們可以在Debug和中的NuGet Release,H使用項目引用但是,如果我們在一個.cs文件中同時使用這些命名空間,則需要添加這兩個命名空間,那麼您將收到錯誤「找不到引用的組件'xxx'」。只有在「釋放」或「調試」模式,因爲VS找不到這兩個命名空間:

enter image description here

要解決此錯誤,我們有註釋的命名空間,其在其他配置模型你的時候將配置模型從Debug更改爲Release。

enter image description here