从命令行发布Web应用程序

Kie*_*ron 16 msbuild publish build visual-studio-2010

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

到目前为止,我已经尝试了各种各样的东西,MSBuild,aspnet_compiler,但迄今为止没有任何工作.

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

除了所有这些之外,我还想单独留下项目 - 不要在整个地方添加msbuild文件,因为这是一个特定的构建,并不一定与项目相关.

我试过的东西:

Che*_*rek 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 =========================================
Run Code Online (Sandbox Code Playgroud)

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

@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
Run Code Online (Sandbox Code Playgroud)

编辑:上面的代码适用于大多数情况,但不适用于所有情况.即我们使用另一个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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)