2010-01-25 18 views
12

我在我的解决方案中的csproj中有Windows应用程序,并且我想使用命令行(bat,cmd)生成发布。使用MsBuild使用命令行发布的问题点击一次

我的脚本是(我把\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)不会生成任何文件。

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

回答

11

采取进行调试看看this Stack Overflow question。从命令行运行ClickOnce时,基本上PublishUrl属性会被忽略。但是你可以很容易地添加一个额外的MSBuild任务。

我创建了一个额外的MSBuild文件,例如build.csproj。这包含一个publish-task。该任务首先调用目标项目的常规MS-Build。之后,它将结果复制到发布目录。在命令行中运行时

<?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> 
+0

谢谢先生!对于PublishDir,你是一个很棒的神奇示例代码 – 2010-01-26 08:01:38

2

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

你,你可以使用一个分号分隔例如:

/target:rebuild;publish 

MSDN Documentation on command line parameters and MSBuild

如果这也不起作用,你也许可以尝试通过传递

/verbosity:diag 
+0

我试着/目标:重建;发布和只/目标:发布而不是生成的文件发布。 有什么想法吗?谢谢 !!! – 2010-01-25 10:13:52

+0

用/ verbosity运行它:诊断并发布输出 – 2010-01-25 12:37:54

+0

输出的日志文件大小超过1 MB!不可能的帖子在这里... 的问题..我没有得到它发布在我放在CMD文件的文件夹... 谢谢。 – 2010-01-25 15:01:12

16

使用PublishDir代替PublishUrl的:现在我调用“build.csproj”,而不是通过命令行的络项目文件。

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

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

+0

,结尾“\”很重要 – liang 2016-08-22 10:27:12

+0

这应该被标记为正确的答案 – 2017-08-02 21:58:28

相关问题