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

Posted

技术标签:

【中文标题】在 Debug 中使用 Project Reference,在 Release 中使用 Nuget【英文标题】:Use Project Reference in Debug and Nuget in Release 【发布时间】:2017-12-13 23:30:34 【问题描述】:

我想同时在我的项目 (A) 和依赖的 Nuget 包 (B) 中工作,而无需在每次更改时发布 nuget 包。

在构建调试时是否可以从解决方案 (A) 中对 Nuget 项目 (B) 进行项目引用。并且在构建 Release 时使用来自 Source 的 Nuget 包?

【问题讨论】:

Pain-free local development while also referencing NuGet packages的可能重复 【参考方案1】:

一种方法是手动编辑 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 属性负责调试和发布之间的工作。

【讨论】:

工作就像一个魅力,唯一剩下的问题是,如果我需要在包版本更新后编辑 csproj。 在我们使用 VS2012 的环境中,它并不总是能正常工作。所以我们每次都会仔细检查。【参考方案2】:

在构建调试时是否可以从解决方案 (A) 中对 Nuget 项目 (B) 进行项目引用。并且在构建 Release 时使用来自 Source 的 Nuget 包?

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

首先,NuGet包的ID要与引用项目的名称不同,否则,来自NuGet的引用会取代项目引用。(例如TestProjectReferenceForDebug就是名称项目引用的,如果你想同时使用项目引用和NuGet包,你不能使用这个项目直接创建NuGet包,所以我创建了一个不同名称的相同项目来创建NuGet包“@987654328 @"):

第二,你应该在ItemGroup元素中使用Condition属性,否则'TestProjectReferenceForDebug'和'TestNuGetForRelease'之间的引用不明确,所以我们需要在ItemGroup 元素中添加Condition 属性

  <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>

第三,在ItemGroup元素中添加Condition属性与debugrelease后,我们可以在Debug中使用项目引用,在Release中使用Nuget但是,如果我们在一个 .cs 文件中同时使用这两个命名空间,则需要添加这两个命名空间,然后会出现错误“找不到引用的组件 'xxx'”。那是因为 VS 只能在“发布”或“调试”模型中找到这两个命名空间:

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

【讨论】:

如果引用在多个文件中,我觉得这不能很好地扩展。

以上是关于在 Debug 中使用 Project Reference,在 Release 中使用 Nuget的主要内容,如果未能解决你的问题,请参考以下文章

C#:Release-Build-DL​​L 中的 Debug.Assert() 似乎由 Debug-Build-Project 激活

QtCreator怎么使用debug功能

确定已发布 DLL 中的调试/发布模式?没有#DEBUG

delphi debug技巧

eclipse debug as-->maven install 报 is not a maven project

refer to...和refer to...as