【问题标题】:Create multi-target Xamarin.Forms NuGet package创建多目标 Xamarin.Forms NuGet 包
【发布时间】: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 存储库中。

【问题讨论】:

    标签: c# xamarin.forms nuget-package class-library multitargeting


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多