【问题标题】:Publish a Web Application from the Command Line从命令行发布 Web 应用程序
【发布时间】:2011-08-16 10:46:51
【问题描述】:

我在同一个解决方案中有一系列基于 .NET 4 的 Web 应用程序(WCF 和 Web),但需要从命令行选择性地发布。

到目前为止,我已经尝试了各种方法,MSBuild、aspnet_compiler,但到目前为止都没有奏效。

我需要能够指定项目,而不是解决方案,运行任何转换并将输出重定向到文件夹...基本上模仿鼠标右键单击“发布”选项,使用文件系统。

除了所有这些,我想不理会这些项目 - 不要到处添加 msbuild 文件,因为这是一个特定的构建,不一定与项目相关。

我尝试过的东西:

【问题讨论】:

  • 查看这个question的答案
  • 谢谢,但这是针对 Web 项目,而不是 Web 应用程序。不幸的是,它们的工作方式不同。

标签: visual-studio-2010 msbuild build publish


【解决方案1】:

将以下脚本另存为 publishProject.bat

rem publish passed project 
rem params: %configuration% %destDir% %srcDir% %proj%
@echo off
SET DestPath=d:\projects\Publish\%2
SET SrcPath=d:\projects\Src\%3\
SET ProjectName=%4
SET Configuration=%1

RD /S /Q "%DestPath%" rem clear existed directory
:: build project
MSBuild  "%SrcPath%%ProjectName%.vbproj" /p:Configuration=%Configuration%
:: deploy project
::/t:TransformWebConfig
MSBuild "%SrcPath%%ProjectName%.vbproj" /target:_CopyWebApplication /property:OutDir=%DestPath%\ /property:WebProjectOutputDir=%DestPath% /p:Configuration=%Configuration%
xcopy "%SrcPath%bin\*.*" "%DestPath%\bin\" /k /y

echo =========================================
echo %SrcPath%%3.vbproj is published
echo =========================================

我从另一个批处理文件中调用它

@echo off
rem VS2010. For VS2008 change %VS100COMNTOOLS% to %VS90COMNTOOLS%
call "%VS100COMNTOOLS%\vsvars32.bat" 
SET ex=.\publishProject.bat Release

call %ex% KillerWebApp1 KillerWebApp1\KillerWebApp1 KillerWebApp1
call %ex% KillerWebApp2 KillerWebApp2\KillerWebApp2 KillerWebApp2
call %ex% KillerWebApp3 KillerWebApp3\KillerWebApp3 KillerWebApp3
call %ex% KillerWebApp4 KillerWebApp4\KillerWebApp4 KillerWebApp4

编辑: 上面的代码适用于大多数情况,但并非适用于所有情况。 IE。我们使用另一个 asp .net 应用程序并将其链接为 IIS 中的虚拟文件夹。对于这种情况,VS2008 可以很好地使用上面的代码,但是 VS2010 在部署时也会从虚拟目录中复制文件。以下代码在 VS2010 中也能正常工作 (solution was found here)

添加到您的项目文件(*.csproj、*.vbproj)

<Target Name="PublishToFileSystem" DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
    <Error Condition="'$(PublishDestination)'==''" Text="The PublishDestination property must be set to the intended publishing destination." />
    <MakeDir Condition="!Exists($(PublishDestination))" Directories="$(PublishDestination)" />

    <ItemGroup>
        <PublishFiles Include="$(_PackageTempDir)\**\*.*" />
    </ItemGroup>

    <Copy SourceFiles="@(PublishFiles)" DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="True" />
</Target>

publishProject.bat 更改为:

rem publish passed project 
rem params: %configuration% %destDir% %srcDir% %proj%
@echo off
SET DestPath=d:\projects\Publish\%2
SET SrcPath=d:\projects\Src\%3\
SET ProjectName=%4
SET Configuration=%1

:: clear existed directory
RD /S /Q "%DestPath%"

:: build and publish project
MSBuild "%SrcPath%%ProjectName%.vbproj" "/p:Configuration=%Configuration%;AutoParameterizationWebConfigConnectionStrings=False;PublishDestination=%DestPath%" /t:PublishToFileSystem

【讨论】:

  • 工作,谢谢!将其移至调用命令行 msbuild 的 C# 应用程序中。谢谢。
【解决方案2】:

我知道这是一个老问题,但我刚刚学到了一些东西,所以我决定分享:虽然“_CopyWebApplication”目标存在并且有效,但从 .NET 4.0 开始,它已被取代通过 Microsoft.Web.Publishing.targets 中的“_WPPCopyWebApplication”目标,它支持 web.config 转换语法等新功能。

【讨论】:

    【解决方案3】:

    你检查过WebDeploy吗?

    这应该完成您需要的所有步骤 - 它可以将 Web 应用程序捆绑到可部署文件(基本上是 ZIP)中,并且服务器上有一个“引擎”可以解释该可部署包并完成所有工作为您完成繁重的工作。

    另请参阅 Scott Hanselman 的 Web Deployment Made Awesome: If You're Using XCopy, You're Doing It Wrong 博客文章 - 非常有启发性!

    【讨论】:

    • 这是为部署到我们无权访问的受控服务器做准备,因此我们需要提供一个文件夹,其中包含代码供变更团队部署。
    • @Kieron:为什么不能提供 ZIP 文件而不是目录??
    • 不幸的是,这不是我的过程。但是我们也没有部署到 IIS,我们正在部署到一个文件夹。
    【解决方案4】:

    我的 CCNET 解决方案与 Web.config 转换

    <tasks>
        <msbuild>
            <executable>C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</executable>
            <workingDirectory>E:\VersionesCC\Trunk_4\SBatz\Gertakariak_Orokorrak\GertakariakMS\Web</workingDirectory>
            <projectFile>GertakariakMSWeb2.vbproj</projectFile>
            <targets>Build</targets>
            <timeout>600</timeout>
            <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll</logger>
            <buildArgs>
                /noconsolelogger /p:Configuration=Release /v:diag
                /p:DeployOnBuild=true
                /p:AutoParameterizationWebConfigConnectionStrings=false
                /p:DeployTarget=Package
                /p:_PackageTempDir=E:\Aplicaciones\GertakariakMS2\Web
            </buildArgs>
            </msbuild>
    </tasks>
    

    【讨论】:

    • 这个答案没有解释你为什么这样做,如何处理你列出的 sn-p,所有这些硬编码的值需要如何适应读者自己的情况,以及您所说的“为 CCNET”是什么意思。
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多