MSBuild不尊重我的ClickOnce应用程序的PublishUrl属性

30

我正在尝试制作一个批处理文件,只需一次点击即可发布我们拥有的几个ClickOnce应用程序。我正在使用msbuild进行操作,以下命令行是我如何实现它的示例:

msbuild
    MyApp.sln
    /t:Publish
    /p:Configuration=Release
    /p:PublishUrl="C:\Apps\"
    /v:normal > Log.txt

当我运行上述命令时,它会在发布目录(即bin\release)中构建和发布应用程序。不知道为什么msbuild不遵守我的上面示例中的PublishUrl属性?请注意:我尝试过不同的组合,包括删除“Configuration”,使用“Rebuild”和“PublishOnly”作为目标,以及删除引号,但都没有成功。

13
使用PublishDir代替PublishUrl即可解决问题。 - BrainSlugs83
使用PublishDir=C:\Temp,目录名不需要加引号。这对我起作用了。 - Robin
4个回答

39

你设置了错误的属性。请尝试使用 PublishDir。

你可以像现在这样将它传递到MSBuild中,或者你可以像这样在项目文件(或者可能是sln文件,我不确定,我总是使用项目文件)中进行设置。

<PropertyGroup>
  <PublishDir>C:\Dev\Release\$(BuildEnvironment)\</PublishDir>
</PropertyGroup>

我刚刚写了几篇关于MsBuild和ClickOnce的博客文章,看看吧,你“应该”会发现它们很有用...


1
<MSBuild Projects="$(My.sln)" Targets="Publish" Properties="PublishDir=$(MyPublishLocation)" /> 在使用 MSBuild 4 时对我有效。 - David Laing
@Lee Grissom:哦,你不必这么做...毕竟,没有你的评论,我的信息也是不完整的。但既然现在无法改变,我将在此总结两者:1)$(PublishDir)可以是本地路径或UNC;2)自3.5以来,它不必像SolutionDir等其他目录路径一样以''结尾,但我不会依赖这种不一致性。 - ivan_pozdeev
4
对于我的 MSBuild 版本 4.0.30319.18213,PublishDir 属性似乎需要使用反斜杠结尾。 - binki
当我添加/p:PublishDir=%InstallUrl%时,msbuild会报错无效的开关,这让我很困惑......我们该如何将其传递给msbuild呢? - PandaWood

16

有些功能是由Visual Studio完成的,而不是MSBuild脚本。因此,当从命令行执行时,ClickOnce部署的行为会有所不同。

  • 每次构建时,ApplicationRevision不会增加。这只在从Visual Studio执行时有效。
  • 在某些情况下,PublishUrl未被使用。来自MSDN的引用:

    例如,您可以将PublishURL设置为FTP路径,并将InstallURL设置为Web URL。在这种情况下,PublishURL仅在IDE中用于传输文件,但在命令行构建中不使用。最后,如果您想发布一个ClickOnce应用程序,使其从安装位置以外的位置更新自己,则可以使用UpdateUrl。

我创建了一个特殊的MSBuild文件来完成这些操作。它运行发布目标,然后将文件复制到正确的位置。

这是alhambraeidos请求的构建文件示例。它基本上运行常规的Visual Studio构建,然后将ClickOnce数据复制到真正的发布文件夹中。请注意,我删除了一些项目特定的内容,所以它可能已经失效。此外,它不会增加构建号。这是由我们的持续构建服务器完成的:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Publish" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <!-- the folder of the project to build -->
        <ProjLocation>..\YourProjectFolder</ProjLocation>
        <ProjLocationReleaseDir>$(ProjLocation)\bin\Release</ProjLocationReleaseDir>
        <ProjPublishLocation>$(ProjLocationReleaseDir)\app.publish</ProjPublishLocation>
        <!-- This is the web-folder, which provides the artefacts for click-once. After this
         build the project is actually deployed on the server -->
        <DeploymentFolder>D:\server\releases\</DeploymentFolder>
    </PropertyGroup>


    <Target Name="Publish" DependsOnTargets="Clean">
        <Message Text="Publish-Build started for build no $(ApplicationRevision)" />
        <MSBuild Projects="$(ProjLocation)/YourProject.csproj" Properties="Configuration=Release" Targets="Publish"/>   


        <ItemGroup>
            <SchoolPlannerSetupFiles Include="$(ProjPublishLocation)\*.*"/>
            <SchoolPlannerUpdateFiles Include="$(ProjPublishLocation)\Application Files\**\*.*"/>
        </ItemGroup>
        <Copy
            SourceFiles="@(SchoolPlannerSetupFiles)"
            DestinationFolder="$(DeploymentFolder)\"
        />
        <Copy
            SourceFiles="@(SchoolPlannerUpdateFiles)"
            DestinationFolder="$(DeploymentFolder)\Application Files\%(RecursiveDir)"
        />      
        <CallTarget Targets="RestoreLog"/>
    </Target>
    <Target Name="Clean">   
        <Message Text="Clean project:" />
        <MSBuild Projects="$(ProjLocation)/YourProject.csproj" Properties="Configuration=Release" Targets="Clean"/>
    </Target>       
</Project>

我添加了一个示例。这是我使用的缩短版本。肯定还有改进的空间。 - Gamlor
2
这与问题无关。问题在于他把PublishUrlPublishDir混淆了。这两个参数不同,执行不同的功能。 - BrainSlugs83

2

我来发表一下我的看法,这个语法似乎是可行的(正确或错误):

/p:publishUrl="C:\\_\\Projects\\Samples\\artifacts\\Web\\"

0
对我来说,解决方案是对路径进行转义。
而不是:
/p:PublishUrl="C:\Apps\"

放置:

/p:PublishUrl="C:\\Apps\\"

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