代码之家  ›  专栏  ›  技术社区  ›  jrummell

如何使用msbuild发布Web?

  •  204
  • jrummell  · 技术社区  · 16 年前

    Visual Studio 2010有一个发布命令,允许您将Web应用程序项目发布到文件系统位置。我想在TeamCity Build服务器上执行此操作,因此我需要使用解决方案运行程序或msbuild执行此操作。我尝试使用发布目标,但我认为这可能适用于ClickOnce:

    msbuild Project.csproj /t:Publish /p:Configuration=Deploy
    

    我基本上想做的正是Web部署项目所做的,但没有外接程序。我需要它来编译wap,删除任何不需要执行的文件,执行任何 web.config transformations ,并将输出复制到指定位置。

    我的解决方案 根据Jeff Siver的回答

    <Target Name="Deploy">
        <MSBuild Projects="$(SolutionFile)" 
                 Properties="Configuration=$(Configuration);DeployOnBuild=true;DeployTarget=Package" 
                 ContinueOnError="false" />
        <Exec Command="&quot;$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd&quot; /y /m:$(DeployServer) -enableRule:DoNotDeleteRule" 
              ContinueOnError="false" />
    </Target>
    
    10 回复  |  直到 7 年前
        1
  •  133
  •   jrummell    14 年前

    我得到它主要工作没有自定义的msbuild脚本。以下是相关的TeamCity构建配置设置:

    Artifact paths: %system.teamcity.build.workingDir%\MyProject\obj\Debug\Package\PackageTmp 
    Type of runner: MSBuild (Runner for MSBuild files) 
    Build file path: MyProject\MyProject.csproj 
    Working directory: same as checkout directory 
    MSBuild version: Microsoft .NET Framework 4.0 
    MSBuild ToolsVersion: 4.0 
    Run platform: x86 
    Targets: Package 
    Command line parameters to MSBuild.exe: /p:Configuration=Debug
    

    这将编译、打包(使用web.config转换)并将输出保存为工件。唯一缺少的是将输出复制到指定的位置,但这可以在另一个具有项目依赖关系的TeamCity生成配置中或使用msbuild脚本中完成。

    更新

    下面是一个msbuild脚本,它将编译、打包(使用web.config转换)并将输出复制到我的临时服务器

    <?xml version="1.0" encoding="utf-8" ?>
    <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
            <SolutionName>MySolution</SolutionName>
            <SolutionFile>$(SolutionName).sln</SolutionFile>
            <ProjectName>MyProject</ProjectName>
            <ProjectFile>$(ProjectName)\$(ProjectName).csproj</ProjectFile>
        </PropertyGroup>
    
        <Target Name="Build" DependsOnTargets="BuildPackage;CopyOutput" />
    
        <Target Name="BuildPackage">
            <MSBuild Projects="$(SolutionFile)" ContinueOnError="false" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
            <MSBuild Projects="$(ProjectFile)" ContinueOnError="false" Targets="Package" Properties="Configuration=$(Configuration)" />
        </Target>
    
        <Target Name="CopyOutput">
            <ItemGroup>
                <PackagedFiles Include="$(ProjectName)\obj\$(Configuration)\Package\PackageTmp\**\*.*"/>
            </ItemGroup>
            <Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\build02\wwwroot\$(ProjectName)\$(Configuration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
        </Target>
    </Project>
    

    您还可以从propertygroup标记中删除solutionname和projectname属性,并将它们传递给msbuild。

    msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
    

    更新2

    由于这个问题仍然有大量的流量,我认为用我当前使用的脚本更新我的答案是值得的 Web Deploy (也称为MSDeploy)。

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
      <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
        <ProjectFile Condition=" '$(ProjectFile)' == '' ">$(ProjectName)\$(ProjectName).csproj</ProjectFile>
        <DeployServiceUrl Condition=" '$(DeployServiceUrl)' == '' ">http://staging-server/MSDeployAgentService</DeployServiceUrl>
      </PropertyGroup>
    
      <Target Name="VerifyProperties">
        <!-- Verify that we have values for all required properties -->
        <Error Condition=" '$(ProjectName)' == '' " Text="ProjectName is required." />
      </Target>
    
      <Target Name="Build" DependsOnTargets="VerifyProperties">
        <!-- Deploy using windows authentication -->
        <MSBuild Projects="$(ProjectFile)"
                 Properties="Configuration=$(Configuration);
                                 MvcBuildViews=False;
                                 DeployOnBuild=true;
                                 DeployTarget=MSDeployPublish;
                                 CreatePackageOnPublish=True;
                                 AllowUntrustedCertificate=True;
                                 MSDeployPublishMethod=RemoteAgent;
                                 MsDeployServiceUrl=$(DeployServiceUrl);
                                 SkipExtraFilesOnServer=True;
                                 UserName=;
                                 Password=;"
                 ContinueOnError="false" />
      </Target>
    </Project>
    

    在TeamCity,我有个参数 env.Configuration , env.ProjectName 和 env.DeployServiceUrl . msbuild运行程序具有生成文件路径,参数自动传递(不必在命令行参数中指定)。

    您也可以从命令行运行它:

    msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService
    
        2
  •  74
  •   abatishchev Karl Johan    13 年前

    使用Vs2012中引入的部署配置文件,可以使用以下命令行发布:

    msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=<profile-name> /p:Password=<insert-password> /p:VisualStudioVersion=11.0
    

    有关参数的详细信息 see this .

        3
  •  36
  •   Community Mohan Dere    12 年前

    我想出了这样的解决方案,对我来说非常有用:

    msbuild /t:ResolveReferences;_WPPCopyWebApplication /p:BuildingProject=true;OutDir=C:\Temp\build\ Test.csproj
    

    秘密酱汁是wppcopyWebApplication的目标。

        4
  •  26
  •   Jeff Siver    16 年前

    我不认识Teamcity,所以我希望这对你有用。

    我发现最好的方法是使用msdeploy.exe。这是Microsoft运行的WebDeploy项目的一部分。你可以下载比特 here .

    使用WebDeploy,可以运行命令行

    msdeploy.exe -verb:sync -source:contentPath=c:\webApp -dest:contentPath=c:\DeployedWebApp
    

    这与vs publish命令的作用相同,只将必要的位复制到部署文件夹中。

        5
  •  13
  •   Community Mohan Dere    9 年前

    对于VisualStudio 2012,有一种方法可以在不发布配置文件的情况下处理SubJ。可以使用参数传递输出文件夹。它在“publishurl”参数中同时使用绝对路径和相对路径。您可以使用vs100comntools,但是您需要重写VisualStudioVersion才能使用来自的目标“WebPublish” %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets . 使用VisualStudioVersion 10.0,此脚本将成功,无输出:)

    更新: 我设法在安装了WindowsSDK7.1的构建服务器上使用此方法(计算机上没有Visual Studio 2010和2012)。但我必须遵循以下步骤才能使它工作:

    1. 使用Simmo Answer使计算机上的Windows SDK 7.1成为最新版本( https://stackoverflow.com/a/2907056/2164198 )
    2. 将注册表项hkey_local_machine\software\microsoft\VisualStudio\sxs\vs7\10.0设置为“C:\Program Files\Microsoft Visual Studio 10.0”(根据需要使用您的路径)
    3. 正在将文件夹%programfiles%\msbuild\microsoft\VisualStudio\v11.0从我的开发人员计算机复制到生成服务器

    脚本:

    set WORK_DIR=%~dp0
    pushd %WORK_DIR%
    set OUTPUTS=%WORK_DIR%..\Outputs
    set CONFIG=%~1
    if "%CONFIG%"=="" set CONFIG=Release
    set VSTOOLS="%VS100COMNTOOLS%"
    if %VSTOOLS%=="" set "PATH=%PATH%;%WINDIR%\Microsoft.NET\Framework\v4.0.30319" && goto skipvsinit
    call "%VSTOOLS:~1,-1%vsvars32.bat"
    if errorlevel 1 goto end
    :skipvsinit
    msbuild.exe Project.csproj /t:WebPublish /p:Configuration=%CONFIG% /p:VisualStudioVersion=11.0 /p:WebPublishMethod=FileSystem /p:publishUrl=%OUTPUTS%\Project
    if errorlevel 1 goto end
    :end
    popd
    exit /b %ERRORLEVEL%
    
        6
  •  10
  •   Community Mohan Dere    9 年前

    找到两种不同的解决方案,它们的工作方式略有不同:

    1。这个解决方案的灵感来自于Alexanderb的答案。 [link] . 不幸的是,它对我们不起作用-一些DLL没有复制到外部。我们发现替换 ResolveReferences 具有 Build 目标解决了问题-现在所有必要的文件都复制到外部位置。

    msbuild /target:Build;_WPPCopyWebApplication  /p:Configuration=Release;OutDir=C:\Tmp\myApp\ MyApp.csproj
    这个解决方案的缺点是outdir不仅包含要发布的文件。

    2。第一个解决方案工作得很好,但并不像我们预期的那样。我们希望具有与Visual Studio IDE相同的发布功能,即只有应发布的文件才会复制到输出目录中。正如前面提到的,第一个解决方案将更多的文件复制到outdir中-用于发布的网站随后存储在 _PublishedWebsites/{ProjectName} 子文件夹。下面的命令解决了这个问题-只有要发布的文件才会被复制到所需的文件夹中。所以现在您有了可以直接发布的目录——与第一个解决方案相比,您将在硬盘上节省一些空间。

    msbuild /target:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Release;_PackageTempDir=C:\Tmp\myApp\;AutoParameterizationWebConfigConnectionStrings=false MyApp.csproj
    AutoParameterizationWebConfigConnectionStrings=false 参数将确保连接字符串不会作为特殊工件处理,并且将正确生成-有关详细信息,请参阅 link .
        7
  •  3
  •   Kim Ki Won    11 年前

    必须设置环境

    • <网站名称
    • <领域& GT;

    并参考我的博客。(抱歉,帖子是韩文的)

    • http://xyz37.blog.me/50124665657
    • http://blog.naver.com/PostSearchList.nhn?SearchText=webdeploy&blogId=xyz37&x=25&y=7

      @ECHO OFF
      :: http://stackoverflow.com/questions/5598668/valid-parameters-for-msdeploy-via-msbuild
      ::-DeployOnBuild -True
      :: -False
      :: 
      ::-DeployTarget -MsDeployPublish
      :: -Package
      :: 
      ::-Configuration -Name of a valid solution configuration
      :: 
      ::-CreatePackageOnPublish -True
      :: -False
      :: 
      ::-DeployIisAppPath -<Web Site Name>/<Folder>
      :: 
      ::-MsDeployServiceUrl -Location of MSDeploy installation you want to use
      :: 
      ::-MsDeployPublishMethod -WMSVC (Web Management Service)
      :: -RemoteAgent
      :: 
      ::-AllowUntrustedCertificate (used with self-signed SSL certificates) -True
      :: -False
      :: 
      ::-UserName
      ::-Password
      SETLOCAL
      
      IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v2.0.50727" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v2.0.50727"
      IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v3.5" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v3.5"
      IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v4.0.30319" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319"
      
      SET targetFile=<web site fullPath ie. .\trunk\WebServer\WebServer.csproj
      SET configuration=Release
      SET msDeployServiceUrl=https://<domain>:8172/MsDeploy.axd
      SET msDeploySite="<WebSite name>"
      SET userName="WebDeploy"
      SET password=%USERNAME%
      SET platform=AnyCPU
      SET msbuild=%FXPath%\MSBuild.exe /MaxCpuCount:%NUMBER_OF_PROCESSORS% /clp:ShowCommandLine
      
      %MSBuild% %targetFile% /p:configuration=%configuration%;Platform=%platform% /p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:CreatePackageOnPublish=False /p:DeployIISAppPath=%msDeploySite% /p:MSDeployPublishMethod=WMSVC /p:MsDeployServiceUrl=%msDeployServiceUrl% /p:AllowUntrustedCertificate=True /p:UserName=%USERNAME% /p:Password=%password% /p:SkipExtraFilesOnServer=True /p:VisualStudioVersion=12.0
      
      IF NOT "%ERRORLEVEL%"=="0" PAUSE 
      ENDLOCAL
      
        8
  •  1
  •   Alim İŞÇİ    11 年前

    这是我的批处理文件

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe C:\Projects\testPublish\testPublish.csproj  /p:DeployOnBuild=true /property:Configuration=Release
    if exist "C:\PublishDirectory" rd /q /s "C:\PublishDirectory"
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v / -p C:\Projects\testPublish\obj\Release\Package\PackageTmp -c C:\PublishDirectory
    cd C:\PublishDirectory\bin 
    del *.xml
    del *.pdb
    
        9
  •  0
  •   Alper Ebicoglu    7 年前

    这是我的工作批次

    发布-my-website.bat

    SET MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin"
    SET PUBLISH_DIRECTORY="C:\MyWebsitePublished"
    SET PROJECT="D:\Github\MyWebSite.csproj"
    
    
    cd /d %MSBUILD_PATH%
    MSBuild %PROJECT%  /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=%PUBLISH_DIRECTORY%
    

    请注意,我在服务器上安装了Visual Studio,以便能够运行 MsBuild.exe 因为 MSBudioEXE 在.NET框架中,文件夹不起作用。

        10
  •  0
  •   Yashwant Mahawar    7 年前

    要生成发布输出,请再提供一个参数。 msbuild example.sln/p:publishprofile=profilename/p:deployonbuild=true/p:configuration=debug/或任何

    推荐文章