我在同一个解决方案中有一系列基于.NET 4的Web应用程序(WCF和Web),但需要从命令行中有选择地发布。
到目前为止,我已经尝试了各种各样的东西,MSBuild,aspnet_compiler,但迄今为止没有任何工作。
我需要能够指定项目,而不是解决方案,运行任何转换并将输出重定向到文件夹...基本上模仿鼠标右键单击“发布”选项,使用文件系统。
除了所有这些之外,我还想单独留下项目 - 不要在整个地方添加msbuild文件,因为这是一个特定的构建,并不一定与项目相关。
我试过的东西:
答案 0 :(得分: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(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
答案 1 :(得分:4)
我知道这是一个古老的问题,但我刚学到了一些东西,所以我决定分享:虽然这是&#34; _CopyWebApplication&#34;目标存在并且有效,从.NET 4.0开始,它已被&#34; _WPPCopyWebApplication&#34;取代。 Microsoft.Web.Publishing.targets中的目标,它支持web.config转换语法等新功能。
答案 2 :(得分:0)
你签出了WebDeploy吗?
这应该执行您需要的所有步骤 - 它可以将Web应用程序捆绑到可部署文件(基本上是ZIP),并且服务器上有一个“引擎”可以解释该可部署包并执行所有操作对你来说很重要。
另见Scott Hanselman的Web Deployment Made Awesome: If You're Using XCopy, You're Doing It Wrong博客文章 - 非常有启发性!
答案 3 :(得分: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>