visual-studio-2010 - 从命令行发布 Web 应用程序

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

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

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

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

我尝试过的东西:

  • Publish ASP.NET MVC 2 application from command line and Web.config transformations
  • Equivalent msbuild command for Publish from VS2008

最佳答案

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

https://stackoverflow.com/questions/7076971/

相关文章:

build - 错误 : Sonar server 'http://localhost:9000'

c# - 如何在我的应用程序中显示上次构建的内部版本号和/或日期时间?

tfs - 等待可用代理/等待请求代理

javascript - 如果我仍然在构建时连接所有文件,我为什么要使用 require.js?

java - 将 Google Guava 添加到 Android 项目 - 显着减慢构建速度

c# - 如何在解决方案级别使用 Microsoft.Net.Compilers?

java - 什么是 org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAI

.net - MSBuild 和 F# 的 FAKE 有什么区别?

ios - 如何为 iPhone 构建 Boost-Libraries

javascript - 需要一个带有 webpack 的模块