如何将不同的包包含在不同的 Configuration/Platform 组合中?

How can I include different packages in different Configuration/Platform combinations?

我有一个专为与 Sap Business One 的 SDK 一起使用而设计的库。 V10 的 SDK 与 V9.3 的不同,我也有 x86/x64 和 SQL/HANA 构建,这给了我 8 个排列,因此有 8 个包。

使用这些包的项目也将有 8 个构建。我想设置项目文件和目标,以便为特定配置和平台选择特定包。我正在尝试解决这个问题,但这完全没有意义。

目前我的项目文件中有以下内容:

  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'B1v93SQL|x64' ">
    <PackageReference Include="OchALCommon.v93SQLx64" Version="1.0.*" />
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'B1v93SQL|x86' ">
    <PackageReference Include="OchALCommon.v93SQLx86" Version="1.0.*" />
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'B1v93HANA|x64' ">
    <PackageReference Include="OchALCommon.v93HANAx64" Version="1.0.*" />
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'B1v93HANA|x86' ">
    <PackageReference Include="OchALCommon.v93HANAx86" Version="1.0.*" />
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'B1v10SQL|x64' ">
    <PackageReference Include="OchALCommon.v10SQLx64" Version="1.0.*" />
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'B1v10SQL|x86' ">
    <PackageReference Include="OchALCommon.v10SQLx86" Version="1.0.*" />
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'B1v10HANA|x64' ">
    <PackageReference Include="OchALCommon.v10HANAx64" Version="1.0.*" />
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'B1v10HANA|x86' ">
    <PackageReference Include="OchALCommon.v10HANAx86" Version="1.0.*" />
  </ItemGroup>

Visual studio 表示所有 8 个包和一个构建过程每个包的依赖关系 - 这似乎是错误的。我还在“Directory.Build.targets”文件中尝试了这段代码,最初似乎可以工作,但后来 Visual Studio 停止响应目标文件中的更改(即使在重新启动后)。

我们过去一直使用这种引用方式来引用 Assembly 引用,而且它似乎有效,我不知道如何使 PackageReference 函数。有人知道在我的场景中如何最好地打包这个库吗?

在理想情况下,我想以某种方式将我的 64 位和 32 位构建以及一些适当的目标存储在单个 nuget 包中,以便使用项目获得正确的位数和正确的子项目引用。目前我无法弄清楚如何做到这一点,也无法实现任何其他可行的方案。

同样,有人知道如何做这样的事情吗?

谢谢。

到目前为止,我已经能够通过为每个 ProjectReference 使用单独的文件 (.targets) 解决问题,然后通过引用特定的 .targets 文件确保只有那些包含参考信息的文件包含在项目中。

然后我将 .targets 文件放入伞形 nupkg 中,以 select 我想使用哪些实际有效负载。整个安排如下:

我发布了8个payload文件如下:

  • MyLibrary.v93HANAx64
  • MyLibrary.v93HANAx86
  • MyLibrary.v93SQLx64
  • MyLibrary.v93SQLx86
  • MyLibrary.v10HANAx64
  • MyLibrary.v10HANAx86
  • MyLibrary.v10SQLx64
  • MyLibrary.v10SQLx86

每个负载文件只包含一个标准 lib/net40 文件夹,其中包含 https://docs.microsoft.com/en-us/nuget/create-packages/creating-a-package 页面中指定的库。

我的消费项目有 4 个配置:

  • B1v93HANA
  • B1v93SQL
  • B1v10HANA
  • B1v10SQL

然后我有一个总括项目“MyLibrary.Targets”包含如下内容:

##build/net40/MyLibrary.Targets.targets

<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
    <Import Project="MyLibrary/$(Configuration).targets" />
</Project>

##build/net40/MyLibrary/B1v10HANA.targets

<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
  <ItemGroup>
    <PackageReference Include="MyLibrary.v10HANA$(Platform)" Version="1.0.*" />
  </ItemGroup>
</Project>

##build/net40/MyLibrary/B1v10SQL.targets

<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
  <ItemGroup>
    <PackageReference Include="MyLibrary.v10SQL$(Platform)" Version="1.0.*" />
  </ItemGroup>
</Project>

##build/net40/MyLibrary/B1v93HANA.targets

<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
  <ItemGroup>
    <PackageReference Include="MyLibrary.v93HANA$(Platform)" Version="1.0.*" />
  </ItemGroup>
</Project>

##build/net40/MyLibrary/B1v93SQL.targets

<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
  <ItemGroup>
    <PackageReference Include="MyLibrary.v93SQL$(Platform)" Version="1.0.*" />
  </ItemGroup>
</Project>

我在这个文件夹中也有目标文件,“Debug.targets”和“Release.targets”在这些情况下使用我首选的默认库。

根据上面链接的 Microsoft 指南,

.nupec 所有包的文件都是非常标准的。可以使用 'nuget spec' 命令创建一个默认的 nuspec 文件,然后可以对其进行编辑。

我的功能包 nuspec 文件在 'package/metadata/dependencies' 中包含标识所需包的内容:

    <dependencies>
      <group targetFramework=".NETFramework4.0">
          <dependency id="CryptLib" version="*" /> 
          <dependency id="SAPBusinessOneSDK.HANA" version="10.0.*" />
      </group>
    </dependencies>

我的选择器包“MyLibrary.targets”没有依赖项,但有一个文件部分 'package/files':

  <files>
      <file src="readme.txt" target="" />
  
      <file src="build\**" target="build" />
  </files>

希望这可以节省一些时间。