21

我的解决方案中有 csproj 中的 Windows 应用程序,我想使用命令行(bat、cmd)生成发布。

我的脚本是(我\r\n为了更好的阅读而放置):

 SET MSBUILD="%SystemRoot%\Microsoft.NET\Framework\v3.5\MSBuild.exe"
    SET CARWIN="..\..\Security.CarWin.csproj"

    rem msbuild para publish

    %MSBUILD% /target:rebuild;publish %CARWIN% 
/p:ApplicationVersion="1.0.0.0" 
/p:Configuration=release 
/p:PublishUrl="C:\ClickOnce\CarWin.WebInstall\Publicacion\" 
/p:InstallUrl="http://desserver/carwinclickonce/Publicacion/" 
/p:PublishDir="C:\ClickOnce\CarWin.WebInstall\Publicacion\" 

注意:我也会尝试使用/target:publish

但在路径 PublishDir 或 PublishUrl (C:\ClickOnce\CarWin.WebInstall\Publicacion) 中不会生成任何文件。

我在这个网站和谷歌上看到了很多帖子,但我没有找到任何解决方案。

4

3 回答 3

26

从命令行运行时使用 PublishDir 而不是 PublishUrl。

msbuild /target:publish /p:Configuration=Release;PublishDir=c:\playground\

您还可以更改版本,例如 ApplicationRevision=666;MinimumRequiredVersion=1.1

于 2013-12-05T16:39:54.367 回答
14

看看这个 Stack Overflow 问题PublishUrl从命令行运行 ClickOnce 时,基本上会忽略该属性。但是您可以通过额外的 MSBuild 任务轻松添加行为。

我创建了一个额外的 MSBuild 文件,例如build.csproj. 这包含一个publish-task. 此任务首先调用目标项目的常规 MS-Build。然后它将结果复制到发布目录。现在我从命令行调用“build.csproj”而不是 reguar 项目文件:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="3.5" DefaultTargets="Publish" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <!-- project name-->
        <ProjectName>MyExampleProject</ProjectName> 
        <!--properties for the project-build-->
        <DefaultBuildProperties>Configuration=Release</DefaultBuildProperties> 
        <!-- location of the click-once stuff, relative to the project -->
        <ProjectPublishLocation>.\bin\Release\app.publish</ProjectPublishLocation> 
        <!-- Location you want to copy the click-once-deployment. Here an windows-share-->
        <ProjectClickOnceFolder>\\TargetServer\deployments</ProjectClickOnceFolder> 
      </PropertyGroup>
      <Target Name="Publish" DependsOnTargets="Clean">
        <Message Text="Publish-Build started for build no $(ApplicationRevision)" />
        <!-- run the original build of the project -->
        <MSBuild Projects="./$(ProjectName).csproj"
        Properties="$(DefaultBuildProperties)"
        Targets="Publish"/>
        <!-- define the files required for click-once-->
        <ItemGroup>
          <SetupFiles Include="$(ProjectPublishLocation)\*.*"/>
          <UpdateFiles Include="$(ProjectPublishLocation)\Application Files\**\*.*"/>
        </ItemGroup>
        <!-- and copy them -->
        <Copy
        SourceFiles="@(SetupFiles)"
        DestinationFolder="$(ProjectClickOnceFolder)\"/>
        <Copy
        SourceFiles="@(UpdateFiles)"
        DestinationFolder="$(ProjectClickOnceFolder)\Application Files\%(RecursiveDir)"/>
      </Target>
      <Target Name="Clean">
        <Message Text="Clean project" />
        <MSBuild Projects="./$(ProjectName).csproj"
        Properties="$(DefaultBuildProperties)"
        Targets="Clean"/>
      </Target>
    </Project>
于 2010-01-25T16:59:16.347 回答
2

我不知道这是否是一个问题,但我注意到您将 /target 参数传递了两次?

您可以使用分号分隔的示例:

/target:rebuild;publish

有关命令行参数和 MSBuild 的 MSDN 文档

如果这也不起作用,您也许可以尝试通过传递来调试它

/verbosity:diag
于 2010-01-25T08:49:14.003 回答