如何将不同的包包含在不同的 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>
希望这可以节省一些时间。
我有一个专为与 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>
希望这可以节省一些时间。