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


82

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

例如,

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

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

这个问题是关于构建XML的,但是我没有尝试做那么多的细节。

我只是在尝试进行部署。

该问题的最下方,有人说“ MSDeploy”。我可以调查一下,但这是唯一的选择吗?我没有能力在服务器上安装Web部署。在这种情况下,我真正需要做的就是“发布”并将已发布项目的内容发送到服务器/文件系统上的给定目录。

有人有我可以使用的一个内胆吗?

我必须使用MSDeploy吗?

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

在服务器上设置Web部署是否不需要设置某些端口,权限和安装某些IIS加载项?

我很想执行简单的事情。

Answers:


152

在VS 2012(以及VS 2010的Azure SDK中可用的发布更新)中,我们简化了Web项目的命令行发布。我们通过使用“发布配置文件”来做到这一点。

在VS中的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


3
我认为OP只是想将Web应用“部署”到他本地计算机上的任意文件夹中。
理查德·萨雷

3
因此,在部署服务器上,一个人将需要安装Visual Studios IDE才能使这样的命令起作用?
Erik5388


10
这在VS 2013中有效吗?运行相同的命令行,不会发布。也没有错误。在发布配置文件中使用简单的文件系统部署进行测试。构建作品,但没有发布结果。目的地为空。
Rex Whitten 2014年

2
当我使用它时,即使.pubxml文件具有<LastUsedBuildConfiguration> Release </ LastUsedBuildConfiguration>,它也会发布我的Debug版本
reggaeguitar 2015年

11

创建一个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>

7
这个答案对我非常有帮助,但是我需要增加一件事来改进它。如果以书面形式执行,则robocopy将返回退出代码1,以指示复制成功...使msbuild认为构建已失败。要解决此问题,只需在robocopy命令中的/ e后面附加“如果%errorlevel%leq 1退出0否则退出%errorlevel%”。
亚历克斯

上面的答案和亚历克斯的评论都对我有帮助。我还将在</ Target>之前添加<RemoveDir Directories =“ $(CopyTo)” />,以保持项目文件夹的清洁。
JackArbiter 2013年

6

以下命令可以完美运行:

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

3
当您只想发布内容文件时,此方法有效。但是未执行web.config转换
andreas

1
此方法不适用于发布MVC网站(视图不会复制)
eka808 '16

对于Web应用程序(例如Web API),bin文件夹中不会生成两个关键文件:App_global.asax.dll和App_global.asax.compiled。我建议使用上面所说的例子。
Fred Peters

1

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

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

其中config-name = Release或您创建的其他一些构建配置


0

对于Web项目,您需要按照上述要求进行构建,但随后还需要打包/复制。我们使用文件副本,而不是“发布” ...

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

因此,我们首先使用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目标,瞧!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.