【问题标题】:.net core 3.1 pack dll with Azure Devops.net core 3.1 pack dll 与 Azure Devops
【发布时间】:2020-02-24 15:02:07
【问题描述】:

我正在尝试使用 Azure Pipeline 打包我在 .net core 3.1 中制作的 web api。

  - task: DotNetCoreCLI@2
displayName: Package NuGet
inputs: 
  command: 'pack'
  projects: '**/*.csproj'
  arguments: '--configuration $(BuildConfiguration)'
  outputDir: '$(Build.ArtifactStagingDirectory)/packages'

这就是我使用的任务,我从另一个关于堆栈溢出的帖子中找到的。

我唯一的问题是它提供了许多 .nupkg 文件,而不是一个,并且 web api 包没有依赖 dll。

我还创建了一个 .nuspec 文件,但我似乎无法在 Azure Pipeline 中正确使用它 我已经尝试过这里解释的内容:https://docs.microsoft.com/fr-fr/nuget/reference/msbuild-targets#packing-using-a-nuspec

或者只是像管道工具提示中解释的那样定位 .nuspec 文件

如果有人能让我走上正确的道路,我将不胜感激:)

编辑: 我想将所有内容打包在一个 nupkg 中,然后将其部署到 IIS 站点。

这是我的 nuspec 文件:

   <?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
        <id>WebAPI</id>
        <version>1.0.0</version>
        <authors>Kevin Pinero</authors>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>WebAPI</description>
    </metadata>
    <files>
        <file src=".\bin\Release\*\*.dll" target="lib" />
        <file src=".\bin\Release\*\*.exe" target="lib" />
        <file src=".\bin\Release\*\*.json" target="lib" />
       <!-- <file src=".\bin\Release\*\Properties\*.json" target="lib" /> -->
        <file src=".\bin\Release\*\*.pdb" target="lib" />
        <file src=".\bin\Release\*\*.config" target="lib" />
    </files>
</package>

这是我在管道上遇到的错误:

错误 MSB4068:该元素无法识别或不受支持 在这种情况下。

使用这个任务:

  - task: DotNetCoreCLI@2
    inputs:
      command: 'pack'
      packagesToPack: '**/*API.nuspec'
      nobuild: true
      versioningScheme: 'off'

我知道在微软网站上我也可以使用这个命令

dotnet pack ~/projects/app1/project.csproj -p:NuspecFile=~/projects/app1/project.nuspec -p:NuspecBasePath=~/projects/app1/nuget

但我不确定如何在 AZ 管道中翻译它...

采用的EDIT解决方案:

我决定以这种方式解决我的问题:

  - task: DotNetCoreCLI@2
    displayName: Build at solution level
    inputs:
      command: 'build'
      projects: $(solution)
      arguments: '--no-restore --configuration $(buildConfiguration)'

  - task: DotNetCoreCLI@2
    displayName: Execute tests
    inputs:
      command: 'test'
      projects: $(testProjects)
      arguments: '--no-build --configuration $(buildConfiguration)'

  - task: DotNetCoreCLI@2
    displayName: Pack project
    inputs:
      command: publish
      projects: '**/projectName.csproj'
      publishWebProjects: False
      arguments: '--no-build --configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)
      zipAfterPublish: False

  - task: PublishBuildArtifacts@1
    displayName: Publish 
    inputs:
      pathtoPublish: '$(Build.ArtifactStagingDirectory)' 
      artifactName: 'artefact name'

【问题讨论】:

  • 您想通过将 API 项目打包到 .nupkg 中来完成什么?
  • 您在尝试使用.nuspec 文件时遇到了什么问题?请编辑您的问题,向"not manage to use it correctly" 提供有关这对您意味着什么的详细信息,以便您在这方面的问题得到解决。
  • 您可能需要在 WebApi.csproj 文件中进行一些编辑作为解决方法。这样 dotnet pack 将拾取依赖程序集并将它们一起打包到包中。您可以尝试我答案末尾的两个链接,如果您对如何做到这一点感到困惑并需要更多详细信息,请随时告诉我。
  • 你好朋友,这个问题有更新吗?只需检查一下您是否需要任何进一步的帮助:)

标签: .net-core azure-devops


【解决方案1】:

我建议使用 Azure DevOps 在线管道编辑器。使用起来非常棒,可以快速上手(自动完成、语法审查、直接提交/推送)。

您尝试实现的目标可以通过以下步骤完成:

  • dotnet 构建
  • dotnet pack -> 在此处指定要打包的正确项目
- task: DotNetCoreCLI@2
displayName: 'Create packed NuGet files'
inputs:
  command: 'pack'
  packagesToPack: '**/*Api.csproj;!**/*Tests.csproj'
  versioningScheme: 'off'
  • nuget 推送

只要在csproj中添加一些字段,就不需要nuspec文件。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
    <AssemblyName>Withywoods.Selenium</AssemblyName>
    <RootNamespace>Withywoods.Selenium</RootNamespace>
    <ProjectGuid>{08D9DDB8-BF5B-4E45-8E0C-D9AC85ABF020}</ProjectGuid>
    <Authors>devprofr</Authors>
    <Description>Library to ease the use of Selenium web driver and provide testing best practices.</Description>
    <RepositoryUrl>https://github.com/devpro/withywoods</RepositoryUrl>
    <PackageProjectUrl>https://github.com/devpro/withywoods</PackageProjectUrl>
  </PropertyGroup>

如果你愿意,我在这里有一个简短的例子:pkg.yml

.NET Core 和 Azure DevOps 是一个很好的组合,如果您有任何问题,请随时发表评论!

(就我而言,我打包库项目但不打包 Api,我在 Api 上进行 dotnet publish 以将它们用作发布管道中的工件。)

【讨论】:

  • 您好,感谢您的回复!我不确定我是否了解您的任务如何处理项目与其他项目的依赖关系?当我尝试时,在我的文件夹中我仍然只有我的项目 dll。还有为什么要把 *Tests.dll 放在一个包里?
  • .NET 负责添加依赖项:) 我放了一个!在测试排除 dll 之前。试一试,我知道它的效果很好:构建步骤将构建所有项目,而 dotnet pack 将创建包含所有内容的好包。我认为您原来的 yaml 缺少 packagesToPack 选项。
【解决方案2】:

我唯一的问题是它提供了许多 .nupkg 文件, 而不是一个,并且 web api 包没有 依赖dll。

我假设您在同一个解决方案中有多个项目。我们将 Web Api 项目称为 A,其他项目称为 BCD...

1.所以如果你只想将A打包到nuget包中,而不是使用projects: '**/*.csproj',我们可以使用projects: '**/A.csproj'之类的东西。那么它就不会再打包一些nuget包了。

2.对于依赖项dll,我认为您的意思是上面提到的Josh Gust之类的项目引用。为此,它仍然是一个关于dotnet pack 命令的open issue。如果有任何更新,您可以在那里跟踪该问题以获取通知。

目前,我们必须对 A.csproj 进行更改,以使用 msbuild 魔法作为解决方法。您可以在那里尝试Martin'szvirja's 解决方法。在我看来,它们都有助于解决您的问题。

希望以上所有帮助:)

更新1:

对于您的编辑,如果您想在 AZ 管道中翻译它,您可以使用custom 命令调用该包。像这样的:

- task: DotNetCoreCLI@2
  displayName: 'dotnet custom'
  inputs:
    command: custom
    projects: '**/ProjectName.csproj'
    custom: pack
    arguments: '-p:NuspecFile=~/projects/app1/project.nuspec -p:NuspecBasePath=~/projects/app1/nuget'

您可以检查日志以确认它确实运行了命令:"C:\Program Files\dotnet\dotnet.exe" pack D:\a\1\s\xxx\xxx.csproj -p:NuspecFile=~/projects/app1/project.nuspec -p:NuspecBasePath=~/projects/app1/nuget。希望这就是您所需要的。

我不确定我们是否可以在该命令中使用~,但如果它在本地工作,那么您可以使用我的方式在 Azure Devops Pipeline 中翻译它...

【讨论】:

  • 我觉得奇怪的是微软没有把这些事情推到最后,感觉已经完成了一半。我想我会专注于让 .nuspec 文件正常工作
  • @KevinPinero 你可以查看我的 Update1,也许它可以帮助翻译 Azure Devops 中的命令 :)
  • 我几乎想复制在 bin\Release\netcoreapp3.1 下构建的任何内容并将其公开给 Azure 版本
  • @KevinPinero 执行构建结果的 copy and expose 是可行的方法,但使用 dotnet publish 执行此操作(请参阅我的答案的更新)
  • 我不确定将 web api 打包到 nuget 包中是否正确,因为我从未做过这种工作。所以让我专注于你的最后一条评论I am almost tempted to just copy whatever has been built under bin\Release\netcoreapp3.1 and to expose this to Azure release。您是否在构建中寻找·发布构建工件任务· 并在发布中下载工件任务?检查this document
【解决方案3】:

更新



因为您正在尝试打包 Web API 项目以交付给 IIS,所以您应该停止尝试使用 nuget 作为该机制,而应使用 dotnet publish 命令。如果您想继续使用DotNetCoreCLI@2 任务(而不是使用script 快捷方式直接调用dotnet cli),那么我会为您指向@987654321 的文档@。

本文档并非专门为 Web API 项目编写,而是一组用于操作 .Net Core Apps 的通用指南,即 Azure DevOps Pipelines。下面引用了一个例子(强调我的)

在构建和测试您的应用 (不是专门的 Web api) 之后,您可以将构建输出上传到 Azure Pipelines 或 TFS,创建并发布 NuGet打包,将构建输出打包成 .zip 文件以部署到 Web 应用程序

当您在打包并交付您的代码部分读到publish to a NuGet feed 是交付代码的有效选项时,确实如此。但是,这种交付方法应该用于库类型的交付物。 dotnet publish 命令旨在将 Web api 项目及其所有依赖项打包到 .zip(或文件夹,如果您指定该选项),以准备针对 IIS 实例的 Web 部署命令.



原答案



无需详细说明为什么要从 API 项目创建 .nupkg

你提到:

我唯一的问题是它提供了许多 .nupkg 文件,而不是一个,并且 web api 包没有依赖 dll

关于项目到项目 (P2P) 的引用,这是 MOdotnet pack for a while now

dotnet pack 的文档说明了这种行为。

打包项目的 NuGet 依赖项已添加到 .nuspec 文件中,因此在安装包时会正确解析它们。 项目到项目的引用未打包在项目中。目前,如果您有项目到项目的依赖关系,则必须为每个项目有一个包。

如果您想对.nupkg 中包含的文件有更多控制权,那么您将需要手动创建.nuspec 文件并将其提供给dotnet pack 命令,如最后Example 所示在文档页面上。

使用 dotnet core cli DotNetCoreCLI@2 的 Azure DevOps 任务应该允许您简单地将 .nuspec 文件的路径放在输入中。如果这对您不起作用,则需要在您的问题中提供更多信息。

【讨论】:

  • 我在帖子上添加了我尝试过的东西的编辑:)
猜你喜欢
  • 2020-07-08
  • 1970-01-01
  • 2020-10-18
  • 2020-07-14
  • 2020-05-23
  • 2020-11-13
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
相关资源
最近更新 更多