【发布时间】:2020-06-10 11:17:34
【问题描述】:
我正忙于为 ASP.NET MVC 应用程序创建 Azure Devops 构建管道,但我一直在恢复一些 NuGet 包。
我决定将所有文件夹添加到 NuGet 包安装添加的 .gitignore 文件中。因为管道会在执行 NuGet 还原时重现此文件。
不幸的是,对于我安装的其中一个 NuGet 包,这不起作用:预期的文件未添加到我的工件中。
当我在 Visual Studio 中手动安装此包时,NuGet 将在 App_Plugins/uSync 文件夹中添加程序集和一些文件,但 Pipelines 中的 NuGet 还原步骤不会:它仅将程序集添加到最终工件中。 App_Plugins 文件丢失。
在构建管道的 YAML 表示下方:
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'artifact'
publishLocation: 'Container'
非常感谢任何帮助!
【问题讨论】:
-
对于
packages.config,restore和install是有区别的。当您install时,允许修改项目,包括将文件从包中复制到项目文件夹中。使用restore,NuGet 不会修改项目,它只会下载nupkg并解压缩packages文件夹中的zip。install仅适用于 Visual Studio,因为 NuGet 要求 Visual Studio 的项目系统修改项目文件(csproj、vbproj等)。因此,只要您继续使用packages.config,就需要签入这些文件。 -
啊,有道理!有没有办法在管道中执行此操作而不是签入所需的文件?而且..根据您的解释,我希望这种行为适用于我的所有 NuGet 包,但我的一些包已正确添加到工件:程序集和解决方案文件中。
-
如果你在安装一个新包后查看你的项目文件 (csproj)(如果你使用源代码控制系统,你可以查看 diff),你会看到它得到一个 @987654333 @ 指向解决方案包文件夹中程序集的元素。因此,NuGet 不会将任何内容还原到您的项目中,它只会还原到包文件夹中。该项目配置为使用包文件夹中的这些文件。你可以自己试试。
git clean删除所有bin和packages文件夹。在本地执行 NuGet 还原。查看仍然没有bin文件夹。 -
虽然您希望在恢复时将包内容文件复制到项目目录中,但内容文件通常用于填充配置文件默认值,然后对其进行修改(内容或名称已更改、删除, 等等)。如果 NuGet restore 重新创建它们,这些修改将丢失。因此,虽然它可以在您的用例中工作,但在其他用例中确实存在问题。另外,对于非 SDK 风格的项目,需要将 csproj 修改为具有
<Content Include="filename.ext" />。 NuGet 不知道怎么做,但是在 VS 中安装时,NuGet 会告诉 VS 去做。 -
由于这些原因,ASP.NET Core 项目不再通过 NuGet 包引入 Web 开发资产(js、css)。建议使用 npm 或 libman。我不再做 web 开发,所以我不知道将这些工具集成到非核心 ASP.NET 项目中是多么容易。
标签: azure nuget azure-pipelines