使用MSBuild.exe使用cmd行“发布”ASP.NET MVC 4项目

时间:2012-12-17 18:44:15

标签: visual-studio msbuild asp.net-mvc-4 msdeploy

我正在寻找一个针对MSBuild.exe运行的命令,该命令只需要一个MVC 4项目并将其发布到给定目录。

例如,

MSBuild <solution>/<project>.csproj -publish -output=c:/folder

这显然是不正确的语法。我试图简化我的问题。

This question讨论构建XML,但我并没有尝试用这么多细节做任何事情。

我只是想尝试部署。

that question中进一步向下,有人说&#34; MSDeploy&#34;。我可以调查一下,但这是唯一的选择吗?我无法在服务器上安装Web部署。在这种情况下,我真正需要做的就是&#34;发布&#34;并将已发布项目的内容发送到服务器/文件系统上的给定目录。

有没有人可以使用一个班轮?

我是否必须使用MSDeploy?

MSDeploy是否要求在服务器上安装Web部署?

不在服务器上设置Web部署需要设置一些端口,权限和安装某些IIS附加组件吗?

我喜欢执行简单的事情。

5 个答案:

答案 0 :(得分:145)

在VS 2012中(以及VS {2010的Azure SDK中提供的发布更新),我们简化了Web项目的命令行发布。我们通过使用发布配置文件完成了这项工作。

在VS for web项目中,您可以使用发布对话框创建发布配置文件。创建该配置文件时,它会自动存储在Properties \ PublishProfiles下的项目中。您可以使用创建的配置文件从命令行发布以下命令行。

msbuild mysln.sln /p:DeployOnBuild=true /p:PublishProfile=<profile-name>

如果要将发布配置文件(.pubxml文件)存储在其他位置,可以将路径传递给PublishProfile。

发布配置文件是MSBuild文件。如果需要自定义发布过程,可以直接在.pubxml文件中进行。

如果您的最终目标是从命令行传入属性。我会推荐以下内容。在VS中创建示例发布配置文件。检查发布配置文件以确定需要在命令行上传递的MSBuild属性。仅供参考,并非所有发布方法都支持命令行发布(即FTP / FPSE)。

仅供参考。如果您正在构建.csproj / .vbproj而不是.sln并且您使用的是VS 2012,那么您也应该传入/p:VisualStudioVersion=11.0。有关为何查看http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx

的详细信息

答案 1 :(得分:10)

创建一个类似于

的build.xml文件

启动Visual Studio命令提示符

运行msbuild build.xml

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build">

  <PropertyGroup>
    <Build>$(MSBuildProjectDirectory)\Build</Build>
    <ProjectFile>MyProject.csproj</ProjectFile> 
    <ProjectName>MyProjectNameInVisualStudio</ProjectName>
    <CopyTo>$(MSBuildProjectDirectory)\CopyTo</CopyTo>
  </PropertyGroup> 

  <Target Name="Build"> 
    <RemoveDir Directories="$(Build)"/>  
    <MSBuild Projects="$(ProjectFile)" Properties="Configuration=Release;OutputPath=$(Build);OutDir=$(Build)/"></MSBuild>  
    <Exec Command="robocopy.exe  $(Build)\_PublishedWebsites\$(ProjectName) $(CopyTo) /e /is
      if %errorlevel% leq 4 exit 0 else exit %errorlevel%"/>    
  </Target>

</Project>

答案 2 :(得分:1)

我发现说的答案是部署默认配置,即调试。 MSBuild似乎忽略了在发布配置文件中选择的配置。因此,我更改了命令以为部署指定正确的配置...

msbuild mysln.sln /p:Configuration=[config-name] /p:DeployOnBuild=true /p:PublishProfile=[profile-name]

其中config-name =版本或您创建的其他构建配置

答案 3 :(得分:0)

以下命令运作完美:

msbuild Myproject.sln  /t:Rebuild /p:outdir="c:\outproject\\" /p:Configuration=Release /p:Platform="Any CPU"

答案 4 :(得分:0)

对于您需要构建的Web项目,如上所述,但您还需要打包/复制。我们使用文件副本,而不是“发布”......

也;我们使用DEBUG / RELEASE来构建网站;但后来实际环境,即“QA”或“PROD”来处理web.config转换。

所以我们最初用RELEASE构建它,然后用QA打包它 - 在下面的例子中。

  <PropertyGroup>   
    <SolutionName>XXX.Website</SolutionName>
    <ProjectName>XXX.Website</ProjectName>
    <IisFolderName>XXX</IisFolderName>

    <SolutionConfiguration>QA</SolutionConfiguration> <!--Configuration will be set based on user selection-->   

    <SolutionDir>$(MSBuildThisFileDirectory)..</SolutionDir>
    <OutputLocation>$(SolutionDir)\bin\</OutputLocation>
     <WebServer>mywebserver.com</WebServer>
  </PropertyGroup>

  <Target Name="BuildPackage">
    <MSBuild Projects="$(SolutionDir)\$(SolutionName).sln" ContinueOnError="false" Targets="Clean;Rebuild" Properties="Configuration=Release" />
    <MSBuild Projects="$(SolutionDir)\$(ProjectName)\$(ProjectName).csproj" ContinueOnError="false" Targets="Package" Properties="Configuration=$(SolutionConfiguration);AutoParameterizationWebConfigConnectionStrings=False" />
  </Target>

  <Target Name="CopyOutput">
    <ItemGroup>
      <PackagedFiles Include="$(SolutionDir)\$(ProjectName)\obj\$(SolutionConfiguration)\Package\PackageTmp\**\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\$(WebServer)\$(IisFolderName)\$(SolutionConfiguration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
  </Target>

因此;

  1. 设置您的媒体资源
  2. 调用BuildPackage目标
  3. 调用CopyOutput目标 瞧!