在Debug中使用Project Reference并在Release中使用Nuget

时间:2017-07-10 09:34:14

标签: c# .net visual-studio nuget

我想同时在我的项目(A)和一个从属Nuget包(B)中工作,而不需要在每次更改时发布nuget包。

在构建Debug时,是否可以从解决方案(A)中执行项目引用Nuget项目(B)。构建Release时,请使用Source中的Nuget包吗?

2 个答案:

答案 0 :(得分:7)

一种方法是手动编辑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>

Condition元素中的ItemGroup属性正在调试和发布之间完成工作。

答案 1 :(得分:3)

  

在构建Debug时,是否可以从解决方案(A)中执行项目引用Nuget项目(B)。构建Release时,请使用Source中的Nuget包吗?

当然,但您需要了解一些限制。

首先,NuGet包的ID应该与引用项目的名称不同,否则,NuGet的引用将替换项目引用。(例如,TestProjectReferenceForDebug是项目引用的名称,如果你想同时使用项目引用和NuGet包,你不能使用这个项目直接创建NuGet包,所以我创建了一个具有不同名称的相同项目来创建NuGet包“ TestNuGetForRelease“):

enter image description here

第二,您应该在Condition元素中使用ItemGroup属性,否则,'TestProjectReferenceForDebug'和'{{1}之间存在含糊不清的引用}}',所以我们需要TestNuGetForRelease元素中添加Condition属性

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> 元素ConditionItemGroup中添加debug属性后,我们可以在{{}}中使用项目引用{1}}和release中的Nuget,但是,如果我们同时在一个.cs文件中使用这些命名空间,我们需要添加这两个命名空间,然后你会得到一个错误“引用的组件'xxx'无法找到“。那是因为VS只能在“Release”或“Debug”模型中找不到这两个命名空间:

enter image description here

要解决此错误,我们必须在将配置模型从Debug更改为Release时在另一个配置模型中注释命名空间。

enter image description here