29

我正在尝试制作一个批处理文件,以便一键发布我们拥有的几个 ClickOnce 应用程序。我为此使用了 msbuild,例如,下面的命令行显示了我是如何做到的:

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

(为便于阅读包装)

当我运行上面的命令时,它会在发布目录中构建并发布应用程序,即 bin\release!知道为什么 msbuild 在上面的示例中不尊重 PublishUrl 属性吗?

PS:我也尝试了不同的组合,包括删除“配置”,使用“重建”和“发布仅”作为目标,并删除引号但没有任何成功。

4

4 回答 4

39

您设置了错误的属性。请改用 PublishDir。

您可以按原样将其传递到 msBuild 中,也可以将其设置在项目文件中(或者也可以在 sln 文件中设置,不确定我是否总是使用项目文件。)像这样

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

我刚刚写了几篇关于MsBuild 和 ClickOnce的博文,看看你“应该”发现它们有用吗……

祝你好运 :-)

于 2010-02-01T00:44:11.310 回答
16

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

  • ApplicationRevision 不会随着每次构建而增加。这仅在从 Visual Studio 执行时有效
  • 在某些情况下,不使用 PublishUrl。引用 MSDN

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

我创建了一个特殊的 MSBuild 文件来执行此操作。它运行发布目标并将文件复制到正确的位置。

alhambraeidos 要求的构建文件示例。它基本上运行常规的 VisualStudio 构建,然后将单击一次数据复制到真正的发布文件夹。请注意,删除了一些特定于项目的内容,因此它可能已损坏。此外,它不会增加内部版本号。那是由我们的 Continues-Build-Server 完成的:

<?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>
于 2009-12-17T10:54:41.883 回答
2

我会投入 2 美分,这种语法似乎有效(对或错):

/p:publishUrl="C:\\_\\Projects\\Samples\\artifacts\\Web\\"
于 2016-02-10T19:58:17.323 回答
0

对我来说,灵魂是逃离这条路。

代替:

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

放:

/p:PublishUrl="C:\\Apps\\"
于 2020-08-24T10:01:10.220 回答