【问题标题】:How to control output of a nuget package dependencies during build如何在构建期间控制 nuget 包依赖项的输出
【发布时间】:2022-01-15 05:54:03
【问题描述】:

我想在我的应用程序中支持向后兼容性。 简单地说 - 一个应用程序需要使用不同版本的 dll 工作,具体取决于应用程序在运行时获得的标志。

我已经简化了所有内容并创建了一个包含 2 个项目的测试解决方案。 每个项目都有自己的相同 nuget 包版本。

我选择了System.Drawing.Common,因为它没有依赖关系。

ClassLibrary1 包含版本为4.5.0System.Drawing.Common

ClassLibrary2 包含 System.Drawing.Common 版本 6.0.0

两个项目的输出路径相同:

<OutputPath>..\DEBUG\</OutputPath>

当我构建我的解决方案时,我的输出文件夹中只有一个 System.Drawing.Common.dll

因为两个 dll 都有一个名称,只有版本不同。

下图中的期望行为:

  1. 根据版本将nuget包依赖分布到不同的文件夹中。

  2. 根据版本为nuget包依赖添加后缀。

这个想法是控制 nuget 包依赖项的输出。 你知道我怎样才能做到这一点吗?

附:所有其他逻辑 - 根据版本等解决依赖关系超出了这个问题的范围。

【问题讨论】:

    标签: c# .net msbuild nuget devenv


    【解决方案1】:

    这不是 .NET 中包解析的工作方式,您会获得每个包的一个版本,该版本在还原时决定。

    如果你有一个非常小众的问题,可能会有一些时髦的选择,但听起来你可能正试图以一种不常见的方式解决一个常见的问题,这通常是一个坏主意。

    通常,对于向后兼容性问题,库的发布者而不是库的使用者有责任通过不进行破坏性 API 更改来确保一切正常。

    【讨论】:

      【解决方案2】:

      这是可能的。 首先你需要在csproj文件中添加GeneratePathPropertyPackageReference元素

      <ItemGroup>
          <PackageReference Include="System.Drawing.Common">
              <Version>4.5.0</Version>
              <GeneratePathProperty>true</GeneratePathProperty>
          </PackageReference>
      </ItemGroup>
      

      它允许我们使用包含 nuget 包路径的 $(PkgSystem_Drawing_Common) 变量。

      那么我们需要创建一个msbuild targets文件

      <?xml version="1.0" encoding="utf-8"?> 
      <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
          <Target Name="CopyNugetDll" BeforeTargets="BeforeCompile" Outputs="System.Drawing.Common.dll">
              <XmlPeek XmlInputPath="$(ProjectPath)" Query="Project/ItemGroup/PackageReference[@Include='System.Drawing.Common']/Version/text()">
                  <Output TaskParameter="Result" PropertyName="NugetPackageVersion" />
              </XmlPeek>
              <ItemGroup>
                  <NugetrDll Include="$(PkgSystem_Drawing_Common)\lib\net461\System.Drawing.Common.dll" />
              </ItemGroup>
              <Message Text="Copying @(NugetrDll) to $(OutDir)" Importance="high" />
              
              <Exec Command="copy $(PkgSystem_Drawing_Common)\lib\net461\System.Drawing.Common.dll $(OutDir)\System.Drawing.Common.$(NugetPackageVersion).dll" />
          </Target>
      </Project>
      

      这里使用xpath 我们从project.assets.json 文件中选择版本并将其保存在NugetPackageVersion 变量中。 Exec copy 用于将 dll 复制到具有特定前缀的特定位置,该特定前缀包含来自 NugetPackageVersion 变量的值。

      最后,您需要将msbuild targets 文件包含到项目中

      <Import Project="CopyDll.targets" />
      

      【讨论】:

        猜你喜欢
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 2019-03-19
        • 1970-01-01
        相关资源
        最近更新 更多