创建多目标 Xamarin.Forms NuGet 包
Posted
技术标签:
【中文标题】创建多目标 Xamarin.Forms NuGet 包【英文标题】:Create multi-target Xamarin.Forms NuGet package 【发布时间】:2020-07-25 09:40:06 【问题描述】:我正在尝试构建一个可以安装在 Xamarin.android、Xamarin.ios、Xamarin.UWP 和 Xamarin.Forms (.NET Standard) 项目中的 NuGet 包。我不能使用 .NET Standard,因为我的 Android 项目需要自定义 Activity
,iOS 项目需要自定义 AppDelegate
,UWP 项目需要自定义 MainPage。在发起程序中,我想使用ServiceCollection
作为 DI 提供程序。
在文档中,他们仍然提到 Portable Class Library(明确提到的遗留,在 VS 中不再存在)或 Manually Creating Packages(不知道在这里做什么),然后你也有网站提到Xamarin.Forms Plugin
,现在也不存在了。
我已经为所有 4 个项目制定了解决方案,但我不知道如何为所有 4 个项目(所有 3 个目标平台)创建单个 NuGet 包。
有谁知道我们如何构建一个包含 Android、iOS 和 UWP 代码的多目标 NuGet 包,就像 Xamarin.Forms NuGet package 一样?
我也看到过这样的讨论:How does one create a project to create a Nuget package for Xamarin Forms supporting iOS, Android, and UWP?,但我不确定这是否仍然相关,因为 build.props
和 build.targets
不再存在于 MvvmCross 存储库中。
【问题讨论】:
【参考方案1】:起点是https://github.com/onovotny/MSBuildSdkExtras
一年前,我做了一个示例(并收集了一些文档和参考资料),这可能对这个主题有启发:https://github.com/ZeProgFactory/MSBuildSdkExtrasTest
https://github.com/ZeProgFactory/MediaPlayer 正在使用它
最后,您应该在 https://github.com/jamesmontemagno 上查看 James Montemagno 的组件存储库
有了这些参考资料,您应该可以开始了。但是所有这些都与您的方法有很大的不同:
他们正在使用一个项目(通过 MSBuildSdkExtras), 专为所有平台构建 最后,将二进制文件组装到一个 NuGet 中。也许您只能采取最后一步。无论如何,这种方法至少是一种选择。 希望这会有所帮助……
【讨论】:
谢谢,我试试这个 一次处理真的很多。我也在看InAppBillingPlugin,但它立即是一个巨大的项目,我没有任何线索可以从哪里开始。 谢谢。我终于成功了【参考方案2】:我已将工作版本推送到https://github.com/MintPlayer/MintPlayer.MVVM
csproj 文件
<Project Sdk="MSBuild.Sdk.Extras/2.0.41">
<!-- You must have the Android 8.0 SDK installed through the Android SDK manager -->
<PropertyGroup>
<AssemblyName>MintPlayer.MVVM</AssemblyName>
<RootNamespace>MintPlayer.MVVM</RootNamespace>
<TargetFrameworks>netstandard2.0;Xamarin.iOS10;MonoAndroid80;uap10.0.16299</TargetFrameworks>
<_WriteTelemetryProperties>false</_WriteTelemetryProperties>
<Authors>Pieterjan De Clippel</Authors>
<Company>MintPlayer</Company>
<Product>MintPlayer.MVVM</Product>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<Description>This package allows you to implement ViewModel Navigation and Dependency Injection in a Xamarin.Forms project</Description>
<Version>1.0.0</Version>
<Copyright />
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/MintPlayer/MintPlayer.MVVM</PackageProjectUrl>
<RepositoryUrl>https://github.com/MintPlayer/MintPlayer.MVVM</RepositoryUrl>
<PackageTags>Xamarin.Forms, Viewmodel navigation, Dependency Injection</PackageTags>
<PackageReleaseNotes>This package is still under construction</PackageReleaseNotes>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Platforms\**\*.cs" />
<None Include="Platforms\**\*.cs" />
<None Include="Resources\*.cs" />
<Compile Remove="Resources\*.cs" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('uap')) ">
<Compile Include="Platforms\UAP\**\*.cs" />
<Compile Include="Platforms\Common\**\*.cs" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) ">
<Compile Include="Platforms\Common\**\*.cs" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('Xamarin.iOS')) ">
<Compile Include="Platforms\iOS\**\*.cs" />
<Compile Include="Platforms\Common\**\*.cs" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('MonoAndroid')) ">
<Compile Include="Platforms\Android\**\*.cs" />
<Compile Include="Platforms\Common\**\*.cs" />
<AndroidResource Include="Resources\**\*.xml" SubType="Designer" Generator="MSBuild:UpdateAndroidResources" />
<AndroidResource Include="Resources\**\*.axml" SubType="Designer" Generator="MSBuild:UpdateAndroidResources" />
</ItemGroup>
<ItemGroup>
<None Remove="Platforms\Common\MintPlayerMvvmExtensions.cs" />
<None Remove="Platforms\Common\NavigationService.cs" />
<None Remove="Platforms\Common\Platform.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.6" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.6" />
<!--<PackageReference Include="Xamarin.Forms" Version="4.5.0.495" />-->
<PackageReference Include="Xamarin.Forms" Version="3.1.0.697729" />
</ItemGroup>
</Project>
目录.build.props
<Project>
<PropertyGroup>
<Company>MintPlayer</Company>
<Copyright>Copyright © MintPlayer</Copyright>
<RepositoryUrl>https://github.com/MintPlayer/MintPlayer.MVVM</RepositoryUrl>
<Authors>Pieterjan De Clippel</Authors>
<Owners>MintPlayer</Owners>
<PackageReleaseNotes />
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<RepositoryType>git</RepositoryType>
<Product>$(AssemblyName) ($(TargetFramework))</Product>
<NeutralLanguage>en</NeutralLanguage>
<LangVersion>latest</LangVersion>
<NoWarn>$(NoWarn);1591;1701;1702;1705;VSX1000;NU1603</NoWarn>
<GenerateDocumentationFile Condition=" '$(Configuration)' == 'Release' ">true</GenerateDocumentationFile>
<GeneratePackageOnBuild Condition=" '$(Configuration)' == 'Release' and '$(IsTestProject)' != 'true'">true</GeneratePackageOnBuild>
<Platform>AnyCPU</Platform>
<DebugType>portable</DebugType>
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<IsTestProject>$(MSBuildProjectName.Contains('UnitTests'))</IsTestProject>
</PropertyGroup>
</Project>
目录.build.targets
<Project>
<PropertyGroup Condition="$(TargetFramework.StartsWith('netstandard'))">
<DefineConstants>$(DefineConstants);NETSTANDARD;PORTABLE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$(TargetFramework.StartsWith('Xamarin.iOS'))">
<DefineConstants>$(DefineConstants);MONO;UIKIT;COCOA;IOS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$(TargetFramework.StartsWith('MonoAndroid'))">
<DefineConstants>$(DefineConstants);MONO;ANDROID</DefineConstants>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<AndroidResgenClass>Resource</AndroidResgenClass>
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
</PropertyGroup>
</Project>
您必须将以下内容添加到您的 .sln
文件中
Project("2150E333-8FDC-42A3-9474-1A3956D46DE8") = "Solution Items", "Solution Items", "7004E39A-BAF2-4F2F-B505-CC3DEC393CB6"
ProjectSection(SolutionItems) = preProject
Directory.build.props = Directory.build.props
Directory.build.targets = Directory.build.targets
EndProjectSection
EndProject
【讨论】:
以上是关于创建多目标 Xamarin.Forms NuGet 包的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Xamarin Forms 应用程序创建 Nuget 包
在 Xamarin.Forms 中使用 Acr.XamForms Nuget 访问相机和图库的示例代码 [关闭]
如何使用 ScnViewGestures.Forms 在 Xamarin.Forms 中使用 TouchDown 和 TouchUp 事件创建视图