从命令行发布Web应用程序

17

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

迄今为止,我已尝试了各种方法,包括MSBuild、aspnet_compiler等,但均未奏效。

我需要能够指定项目而不是解决方案,并运行所有变换,将输出重定向到一个文件夹……基本上就是模拟使用文件系统时鼠标右键单击“发布”选项。

除此之外,我希望保留项目-不要在各个地方添加msbuild文件,因为这是一个特定的构建,不一定与该项目相关。

我尝试过的东西:


请查看此问题的答案。 - Amir Ismail
2
谢谢,但那是针对网络项目而不是网络应用程序。遗憾的是,它们不能起到相同的作用。 - Kieron
4个回答

15

将以下脚本保存为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

编辑: 以上代码适用于大多数情况,但并非所有情况。例如,我们使用另一个asp .net应用程序,并将其作为虚拟文件夹链接到IIS中。在这种情况下,VS2008使用上面的代码很好用,但是VS2010在部署时也会复制虚拟目录中的文件。下面的代码在VS2010中也可以正常工作(在此找到解决方案

将以下内容添加到您的项目文件(*.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#应用程序中。谢谢。 - Kieron

4

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


0

我对使用Web.config转换CCNET的解决方案:

<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>

1
这个答案缺乏任何关于为什么要这样做的解释,如何处理你列出的代码片段,所有那些硬编码的值需要如何适应读者自己的情况,以及你所说的“for CCNET”是什么意思。 - chiccodoro

0

你看过WebDeploy了吗?

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

还可以看看 Scott Hanselman 的Web Deployment Made Awesome: If You're Using XCopy, You're Doing It Wrong博客文章 - 非常启发性!


这是为部署到我们无法访问的受控服务器做准备,因此我们需要提供一个包含代码的文件夹,供变更团队部署。 - Kieron
@Kieron:为什么你不能提供一个ZIP文件而不是一个目录? - marc_s
不幸的是这不是我的流程。但我们也不是部署到IIS,而是部署到一个文件夹中。 - Kieron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接