【问题标题】:Using MSBuild.exe to "Publish" a ASP.NET MVC 4 project with the cmd line使用 MSBuild.exe 通过 cmd 行“发布”一个 ASP.NET MVC 4 项目
【发布时间】:2012-12-04 21:39:12
【问题描述】:

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

例如,

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

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

This question 谈到了构建 XML,但我并不想做任何事情。

我只是想进行部署。

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

有人有我可以使用的单一衬里吗?

我必须使用 MSDeploy 吗?

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

在服务器上设置 web deploy 不需要设置一些端口、权限和安装一些 IIS 插件吗?

我只想执行一些简单的事情。

【问题讨论】:

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


    【解决方案1】:

    在 VS 2012(以及 VS 2010 的 Azure SDK 中提供的发布更新)中,我们简化了 Web 项目的命令行发布。我们通过使用 Publish Profiles 做到了这一点。

    在 VS 中,您可以使用发布对话框创建发布配置文件。当您创建该配置文件时,它会自动存储在您的项目中 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

    【讨论】:

    • 我认为 OP 只是想将网络应用程序“部署”到他本地机器上的任意文件夹中。
    • 那么,在部署服务器上,人们需要安装 Visual Studios IDE 才能获得类似的命令才能工作?
    • 这在 VS 2013 中有效吗?运行相同的命令行,不会产生发布。也没有错误。在发布配置文件中使用简单的文件系统部署进行测试。构建作品,只是没有发布结果。目的地为空。
    • 当我使用它时,它会发布我的调试版本,即使 .pubxml 文件具有 Release
    【解决方案2】:

    创建一个如下所示的 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>
    

    【讨论】:

    • 这个答案对我很有帮助,但我会添加一件事来改进它。如果您按照书面方式执行,robocopy 将返回退出代码 1 以指示复制成功...导致 msbuild 认为构建失败。要解决此问题,只需在 robocopy 命令中的 /e 之后附加“if %errorlevel% leq 1 exit 0 else exit %errorlevel%”。
    • 上述答案和 Alex 的 cmets 对我都有帮助。我还会在 之前添加 以保持项目文件夹干净。
    【解决方案3】:

    以下命令完美运行:

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

    【讨论】:

    • 当您只想发布内容文件时,此方法有效。但是不执行 web.config 转换
    • 此方法不适用于发布MVC网站(浏览量不复制)
    • 对于 Web API 等 Web 应用程序,bin 文件夹中不会生成两个关键文件:App_global.asax.dll 和 App_global.asax.compiled。我推荐使用上面 Sayed 的例子。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      如上所述,您需要构建 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 目标 瞧!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-05
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多