使用/p:PublishProfile =?进行Dotnet发布

62

我正在尝试按照这里的文档使用特定的pubxml文件调用“dotnet publish”命令:

https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.1&tabs=aspnetcore2x

然而,我尝试的所有方法似乎都导致默认行为,并且/p:PublishProfile部分被忽略。

dotnet publish /p:PublishProfile="MyFolderProfile"

无法正常工作,也没有记录任何错误,构建到默认位置“/obj”下。

不过我注意到,故意输入错误命令也会得到相同的结果,例如:

dotnet publish /p:PublishProfile="MyFolderProfile-XXXXX"

我做错了什么?- 任何指导都将不胜感激!


当然,这不是一个解决方案,但我最终手动列出了所有选项(发布、输出目录等)。 - Felix
你尝试过指定项目构建配置文件吗?像这样: dotnet publish WebApplication.csproj /p:PublishProfile="MyFolderProfile" - Victor Alves
3
@VictorAlves,我不是原帖作者,但我已经在命令行中尝试过该项目,也没有帮助。看起来这个问题是长期存在的,即使使用msbuild也是如此:https://github.com/Microsoft/msbuild/issues/1901。似乎你需要手动在命令行中指定参数,例如“-c Release”,“/p:PublishDir = dist”等。 - Falconne
4
我只在使用微软的软件时遇到这些问题。 - aaaaaa
1
请查看我的回答:https://dev59.com/0VIG5IYBdhLWcg3w0089#62954314 - palindrom
8个回答

23

我的回复有些晚了。我的解决方案是一个简单的.NET Core控制台应用程序ConsoleAppCore.csproj。我使用Visual Studio IDE生成了一个名为FolderProfile.pubxml的发布配置文件,然后以下命令适用于我:

相对路径 - 从解决方案根目录开始

dotnet publish ConsoleAppCore\ConsoleAppCore.csproj /p:PublishProfile=ConsoleAppCore\Properties\PublishProfiles\FolderProfile.pubxml

绝对路径 - 从任何位置开始

dotnet publish "C:\work\ConsoleAppCore\ConsoleAppCore.csproj"   "/p:PublishProfile=C:\work\ConsoleAppCore\Properties\PublishProfiles\FolderProfile.pubxml"

关于Azure DevOps

任务名称=.NET Core

任务版本=2

命令=publish

项目路径=我将其留空

参数=

$(System.DefaultWorkingDirectory)\ConsoleAppCore\ConsoleAppCore.csproj /p:PublishProfile=$(System.DefaultWorkingDirectory)\ConsoleAppCore\Properties\PublishProfiles\FolderProfile.pubxml  --configuration $(BuildConfiguration) --output  $(Build.ArtifactStagingDirectory)\ConsoleAppCore-Publish\
在Azure DevOps的构建流程场景中,我已将输出重定向到$(Build.ArtifactStagingDirectory)文件夹下。我还配置了Publish Artifact任务,以使用分阶段目录变量。
我使用了发布配置XML文件,因为我希望一个单一的文件来管理在Azure DevOps上的全部行为。依靠单个文件来处理所有参数可以简化在Azure上的管理。 Publish Artifact任务为我创建了一个发布包,在Azure DevOps的Artifacts Explorer中它是这样的。请注意,浏览器中的文件名与dotnet publish任务中指定的--output选项的名称相符。 enter image description here

2
不幸的是,在Linux上似乎无法以同样的方式工作。发布配置文件被简单地忽略了。 - Ivaylo Slavov
我不能代表Linux发言,但这是在Windows上让它正常工作的最可靠方法。 - Taul
“相对路径 - 从解决方案根目录”这个解决方案对我有用!谢谢。 - Jan
3
看起来全路径/相对路径现在不应该工作,根据 https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-publish "如果在设置 PublishProfile 属性时指定了路径和文件扩展名,则它们将被忽略。MSBuild 默认查找 Properties/PublishProfiles 文件夹并假定 pubxml 文件扩展名。要指定包括扩展名的路径和文件名,请设置 PublishProfileFullPath 属性而不是 PublishProfile 属性。" - Lanorkin

16

我前一段时间也遇到了同样的问题。我通过改用以下方式调用解决了它:

dotnet build [projectname] /p:PublishProfile=[PublishProfile]

2
[projectname]将是什么? - Anders Lindén
6
/p:DeployOnBuild=true 添加到构建后进行部署 - 参见此处:https://learn.microsoft.com/zh-cn/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-3.1#publish-profiles - shlgug

11

截至2021年10月,与“文件夹发布”相关的有一个未解决的问题,其症状类似于https://github.com/dotnet/sdk/issues/12490

我现在使用的解决方法是手动编辑由VS.Net生成的*.pubxml文件,将PublishUrlPublishDir键都设置为相同的值。

这样,使用dotnet publish -p:PublishProfile=...命令就能按预期工作了。


2
这对我来说是解决方法。谢谢! - solrevdev
3
请注意,正如帖子中所提到的那样,这仍然忽略了诸如“DeleteExistingFiles”之类的内容。 - Rotem

10

你可能需要完整路径,例如:

dotnet publish -c Release /p:PublishProfile=Properties\PublishProfiles\FolderProfile.pubxml

没有指定sln或csproj文件? - Anders Lindén
@AndersLindén 是的,我不需要指定,但我可能只是在目录中有一个单独的.csproj文件。 - andrewb

4

3
请参见https://github.com/dotnet/docs/issues/19677。PublishProfile只是名称,它之前的任何目录都会被忽略。
PublishProfile属性被视为文件名,目录会单独构建。
如果要指定自定义路径,请使用PublishProfileFullPath属性。

1
为了解决这个问题,您必须在您的.pubxml文件中添加一个属性。然后
dotnet publish /p:Configuration=Release /p:PublishProfile=FolderProfile

命令正常运行。

以下是示例。

<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
  <PropertyGroup>
    <DeleteExistingFiles>false</DeleteExistingFiles>
    <ExcludeApp_Data>false</ExcludeApp_Data>
    <LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <PublishProvider>FileSystem</PublishProvider>
    <PublishUrl>C:\MyApp\PUBLISH</PublishUrl>
    <PublishDir>C:\MyApp\PUBLISH</PublishDir>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <_TargetId>Folder</_TargetId>
  </PropertyGroup>
</Project>

你也可以使用相对路径,例如

    <PublishUrl>PUBLISH</PublishUrl>
    <PublishDir>PUBLISH</PublishDir>

1

我在VS构建事件中使用了这个。

dotnet publish $(SolutionDir)DIRECTORI_1/PROJECT_1.csproj -c Release -o C:\Deployments\FOLDER_1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接