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

med*_*kin 12 .net c# visual-studio nuget

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

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

小智 8

一种方法是手动编辑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>
....
Run Code Online (Sandbox Code Playgroud)

在此示例中,使用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>
Run Code Online (Sandbox Code Playgroud)

元素中的Condition 属性ItemGroup是在调试和发布之间完成的.


Leo*_*SFT 5

\n

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

\n
\n\n

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

\n\n

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

\n\n

在此输入图像描述

\n\n

其次,你应该在元素Condition中使用属性,否则,\' \'和\' \'ItemGroup之间存在不明确的引用,所以我们需要元素中添加属性TestProjectReferenceForDebugTestNuGetForReleaseConditionItemGroup

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

第三,当我们在元素Condition中添加和属性后,我们可以在和 Nuget中使用项目引用,但是,如果我们同时在一个 .cs 文件中使用这些命名空间,我们需要添加这两个命名空间,那么您将收到错误“找不到引用的组件\'xxx\'”。这是因为 VS 仅在“Release”或“Debug”模型中找不到这两个命名空间:ItemGroupdebugreleaseDebugRelease

\n\n

在此输入图像描述

\n\n

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

\n\n

在此输入图像描述

\n

  • 我觉得如果引用位于多个文件中,则这不能很好地扩展。 (5认同)