是否可以将 Xamarin 项目发布到 VSTS(DevOps)中的私有 nuget 包提要
Is it possible to publish a Xamarin project to a private nuget package feed in VSTS (DevOps)
创建了 Xamarain 项目并创建了 Devops (VSTS) 管道以构建项目并将其发布到私有 nuget 提要。一切都很好,但是打包 nuget 包的步骤失败了。
1) 我的第一次尝试是使用 "Macos-latest" 对解决方案执行 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\s\Plugin.BLE.Android\Plugin.BLE.Android.csproj" (pack target) (1:2) ->d:\a\s\Plugin.BLE.Android\Plugin.BLE.Android.csproj(94,3): error MSB4019: The imported project "C:\Program Files\dotnet\sdk.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.
Is it possible to publish a Xamarin project to a private nuget package feed in VSTS (DevOps)
答案是肯定的。这取决于您要生成多少个包。
如果你想为 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>
查看文档 Create packages for Xamarin with Visual Studio 2015 了解一些详细信息。
如果要为每个平台创建三个 nuget 包,可以使用 **/*.csproj
包。
出现问题的原因是您需要在构建 project/solution:
之前安装 .NET 核心 SDK
- task: UseDotNet@2
displayName: 'Use .Net Core sdk 2.2.105'
inputs:
version: 2.2.105
希望这对您有所帮助。
所以,我的问题不在我的 nuspec 文件中;真正的问题归结为使用 vmImage:"macos-latest",如果你想构建一个 iOS 项目(iOS 不会在代理 2019 或 2017 下构建,并且你必须使用 MSBuild(不是 VSBuild)
macos-latest 图像有几个问题(我将其称为 iOS 代理)
当您引入另一个依赖它的 nuget 包时,System.Threading.Task.Extensions (STTE) 的 nuspec 包不包括在内。如果包在“标准 .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
- UWP
- Android
- iOS
除 iOS 之外的每个项目都使用 VSBuild 和 2019 代理;然后是ios代理人的淘汰过程。
创建了 Xamarain 项目并创建了 Devops (VSTS) 管道以构建项目并将其发布到私有 nuget 提要。一切都很好,但是打包 nuget 包的步骤失败了。
1) 我的第一次尝试是使用 "Macos-latest" 对解决方案执行 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\s\Plugin.BLE.Android\Plugin.BLE.Android.csproj" (pack target) (1:2) ->d:\a\s\Plugin.BLE.Android\Plugin.BLE.Android.csproj(94,3): error MSB4019: The imported project "C:\Program Files\dotnet\sdk.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.
Is it possible to publish a Xamarin project to a private nuget package feed in VSTS (DevOps)
答案是肯定的。这取决于您要生成多少个包。
如果你想为 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>
查看文档 Create packages for Xamarin with Visual Studio 2015 了解一些详细信息。
如果要为每个平台创建三个 nuget 包,可以使用 **/*.csproj
包。
出现问题的原因是您需要在构建 project/solution:
之前安装 .NET 核心 SDK- task: UseDotNet@2
displayName: 'Use .Net Core sdk 2.2.105'
inputs:
version: 2.2.105
希望这对您有所帮助。
所以,我的问题不在我的 nuspec 文件中;真正的问题归结为使用 vmImage:"macos-latest",如果你想构建一个 iOS 项目(iOS 不会在代理 2019 或 2017 下构建,并且你必须使用 MSBuild(不是 VSBuild)
macos-latest 图像有几个问题(我将其称为 iOS 代理)
当您引入另一个依赖它的 nuget 包时,System.Threading.Task.Extensions (STTE) 的 nuspec 包不包括在内。如果包在“标准 .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
- UWP
- Android
- iOS
除 iOS 之外的每个项目都使用 VSBuild 和 2019 代理;然后是ios代理人的淘汰过程。