在调试中使用项目引用,在发布中使用Nuget

问题描述 投票:0回答:2

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

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

c# .net visual-studio nuget
2个回答
15
投票

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


5
投票

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

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

首先,NuGet包的ID应该与引用项目的名称不同,否则,来自NuGet的引用将替换项目引用。(例如,

TestProjectReferenceForDebug
是项目引用的名称,如果您想要同时使用项目引用和NuGet包,你不能直接使用这个项目来创建NuGet包,所以我创建了一个不同名称的相同项目来创建NuGet包“
TestNuGetForRelease
”):

第二,你应该在

Condition
元素中使用
ItemGroup
属性,否则,'
TestProjectReferenceForDebug
'和'
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>

第三,在使用

Condition
ItemGroup
debug
元素中添加
release
属性后,我们可以在
Debug
中使用项目引用,在
Release
中使用 Nuget,但是,如果我们使用这些如果同时在一个.cs文件中添加了两个命名空间,我们需要添加这两个命名空间,那么你会得到一个错误“无法找到引用的组件‘xxx’”。那是因为 VS 仅在“发布”或“调试”模型中找不到这两个命名空间:

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

© www.soinside.com 2019 - 2024. All rights reserved.