是否可以将Xamarin项目发布到VSTS(DevOps)中的私有nuget包提要

是否可以将Xamarin项目发布到VSTS(DevOps)中的私有nuget包提要,xamarin,azure-devops,devops,pack,Xamarin,Azure Devops,Devops,Pack,创建了一个Xamarain项目,并创建了一个Devops(VSTS)管道来构建该项目并将其发布到私有nuget提要。一切都很好,但是打包nuget包的步骤失败了 1) 我的第一次尝试是使用“Macos最新版本”来执行msbuild@1关于解决方案。Nuget安装程序使用nuspec文件进行打包。打包步骤中出现了一个错误 2) 然后我试着做了一个测试VSBuild@1,然后是DotNetCoreClI@2没有成功 3) 我还尝试将3个项目(iOS、Android、UWP)分成3个独立的作业,但在打

创建了一个Xamarain项目,并创建了一个Devops(VSTS)管道来构建该项目并将其发布到私有nuget提要。一切都很好,但是打包nuget包的步骤失败了

1) 我的第一次尝试是使用“Macos最新版本”来执行msbuild@1关于解决方案。Nuget安装程序使用nuspec文件进行打包。打包步骤中出现了一个错误

2) 然后我试着做了一个测试VSBuild@1,然后是DotNetCoreClI@2没有成功

3) 我还尝试将3个项目(iOS、Android、UWP)分成3个独立的作业,但在打包步骤中也失败了

4) 我尝试了各种打包技术,nuspec文件,csproj文件,但都没有成功

我的YAML文件如下所示:

'
- task: NuGetToolInstaller@1 
   displayName: 'Install nuget.exe 4.4.1'
   inputs:      
     versionSpec: 4.4.1'

- task: NuGetCommand@2
  displayName: "restore the ble solution"
  inputs:
    command: 'restore'
    restoreSolution: '**/*.sln'
    feedsToUse: 'select'
    vstsFeed: '$(packageFeedName)'

- task: MSBuild@1
  displayName: 'Build BLE solution'
  inputs:
    solution: "**/*.sln"
    configuration: '$(buildConfiguration)'      
    msbuildArguments: '/p:OutputPath=$(outputDirectory) /p:JavaSdkDirectory="$(JAVA_HOME)/"'

- task: NuGetCommand@2
  displayName: "pack nuget"
  inputs:
    command: pack
    packagesToPack: './myproject.nuspec'
    packDestination: '$(Build.ArtifactStagingDirectory)'
    versioningScheme: byEnvVar
    versionEnvVar: 'nugetVersion'
    includeSymbols: true
"

我使用nuspec文件时总是会遇到同样的路径问题

Attempting to build package from 'BLE.nuspec'. 

[error]The nuget command failed with exit code(1) and error(Could not find a part of the path /Users/vsts/agent/2.155.1/work/1/s/Plugin.BLE/bin/Release/netstandard2.0.

System.IO.DirectoryNotFoundException: Could not find a part of the path /Users/vsts/agent/2.155.1/work/1/s/Plugin.BLE/bin/Release/netstandard2.0.
当我对包使用**/*.csproj时,我得到:

Build FAILED.
d:\a\1\s\Plugin.BLE.Android\Plugin.BLE.Android.csproj" (pack target) (1:2) ->d:\a\1\s\Plugin.BLE.Android\Plugin.BLE.Android.csproj(94,3): error MSB4019: The imported project "C:\Program Files\dotnet\sdk\2.2.105\Xamarin\Android\Xamarin.Android.CSharp.targets" was not found. 
Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
生成失败。
d:\a\1\s\Plugin.BLE.Android\Plugin.BLE.Android.csproj“(包目标)(1:2)->d:\a\1\s\Plugin.BLE.Android\Plugin.BLE.Android.csproj(94,3):错误MSB4019:未找到导入的项目“C:\Program Files\dotnet\sdk\2.2.105\Xamarin\Android\Xamarin.Android.CSharp.targets”。
确认声明中的路径正确,并且文件存在于磁盘上。
是否可以将Xamarin项目发布到VSTS(DevOps)中的私有nuget包提要

答案是肯定的。这取决于你想生成多少个包

如果要为3个项目(iOS、Android、UWP)创建一个nuget包,则应使用
.nuspec
文件

路径问题是因为未在
.nuspec
文件中设置正确的路径。
.nuspec
文件应设置在
.sln
文件所在的一级以下的文件夹中。dll的路径是存储
.nupsec
文件的相对路径

因此,路径应该如下所示:

<files>
    <!-- Cross-platform reference assemblies -->
    <file src="XamarinDemo\bin\Release\XamarinDemo.dll" target="lib\netstandard2.0\XamarinDemo.dll" />
    <file src="XamarinDemo\bin\Release\XamarinDemo.xml" target="lib\netstandard2.0\XamarinDemo.xml" />

    <!-- iOS reference assemblies -->
    <file src="XamarinDemo.iOS\bin\Release\XamarinDemo.dll" target="lib\Xamarin.iOS10\XamarinDemo.dll" />
    <file src="XamarinDemo.iOS\bin\Release\XamarinDemo.xml" target="lib\Xamarin.iOS10\XamarinDemo.xml" />

    <!-- Android reference assemblies -->
    <file src="XamarinDemo.Android\bin\Release\XamarinDemo.dll" target="lib\MonoAndroid10\XamarinDemo.dll" />
    <file src="XamarinDemo.Android\bin\Release\XamarinDemo.xml" target="lib\MonoAndroid10\XamarinDemo.xml" />

    <!-- UWP reference assemblies -->
    <file src="XamarinDemo.UWP\bin\Release\XamarinDemo.dll" target="lib\UAP10\XamarinDemo.dll" />
    <file src="XamarinDemo.UWP\bin\Release\XamarinDemo.xml" target="lib\UAP10\XamarinDemo.xml" />
</files>

希望这能有所帮助。

因此,我的问题不在我的nuspec文件中;真正的问题归结为使用vmImage:“macos最新版本”,这是构建iOS项目所必需的(iOS不会在代理2019或2017下构建,您必须使用MSBuild(而不是VSBuild)

macos最新映像有几个问题(我称之为iOS代理)

  • 引入另一个依赖于System.Threading.Task.Extensions(STTE)的nuget包时,不包括该包。如果该包位于“Standard.net 2.0项目”中,则STTE包必须包含在标准项目和ios项目中;这仅在ios代理中发生

  • 我用于解决方案路径$(solution)的变量没有扩展到myproj.sln;日志显示路径为/$($solution),项目没有生成,没有生成任何项目的警告或错误;我测试的任何其他代理类型中都没有出现此问题

  • ios代理的Xamarin sdk严重过时,必须进行设置

  • yaml要求:

    variables:
      mono: 5_18_1
      xamarinSDK: 12_8_0_2
    
    
    - task: Bash@3
        displayName: "Set xamarinSDK to version $(mono)"
        inputs:
          targetType: 'inline'
          script: /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(mono)"
    
    用于解决此问题的技术是将Xamarin项目拆分为4个单独的项目,并将它们作为单独的项目发布:

    • .Net标准2.0
    • 超宽带
    • 安卓
    • iOS
    除了iOS-one之外,每个项目都使用VSBuild和2019代理工作;这是iOS代理上的一个消除过程

    variables:
      mono: 5_18_1
      xamarinSDK: 12_8_0_2
    
    
    - task: Bash@3
        displayName: "Set xamarinSDK to version $(mono)"
        inputs:
          targetType: 'inline'
          script: /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(mono)"