【问题标题】:Visual Studio 2010: How to publish an ASP.NET web app to a target folder with MSBUILD?Visual Studio 2010:如何使用 MSBUILD 将 ASP.NET Web 应用程序发布到目标文件夹?
【发布时间】:2011-04-16 01:50:42
【问题描述】:

在 Visual Studio 2010 中,您知道如何更改配置(调试、发布等),在解决方案资源管理器中右键单击项目,单击发布,然后为所选配置获取所有重要的 Web 应用项目文件与 xdt 转换的 web.config 一起复制到目标文件夹?好吧,我正在寻找与此完全相同的 MSBUILD。

我对您的挑战:提供我需要在命令提示符下执行的一行以完成此操作。没有第三方程序。没有教程视频。只需一个简单的命令,我可以从您的响应中复制,粘贴到命令窗口,根据需要进行修改以支持我的目录结构,然后按 Enter。

如果没有,那么也许有人可以提供一个完整的 MSBUILD 参考链接,其中显示了我可以在命令行中使用的每个命令、开关和值。

【问题讨论】:

    标签: visual-studio-2010 msbuild publish


    【解决方案1】:

    将以下内容放入ProjectPublish.MSBuild.xml 文件中(根据需要更改PropertyGroup):

    <?xml version="1.0" encoding="utf-8" ?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Publish"> 
        <PropertyGroup>
            <ProjectFile>Path\To\Web.csproj</ProjectFile>
            <PublishDir>Path\For\Publish\Output</PublishDir>
            <TempDir>Path\To\Temp\Folder</TempDir>
            <BuildConfig>Release|Debug</BuildConfig>
        </PropertyGroup>
    
        <Target Name="Publish">
            <MSBuild Projects="$(ProjectFile)"
                     Properties="Configuration=$(BuildConfig);WebProjectOutputDir=$(PublishDir);OutDir=$(TempDir)\;BuildingProject=true"
                     Targets="ResolveReferences;_CopyWebApplication" />
        </Target>
    </Project>

    从命令行(或.bat 文件)调用它应该可以解决问题:

    %windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ProjectPublish.MSBuild.xml
    

    【讨论】:

    • 以前从未见过这种东西。我是否只是将该 XML 文件添加到项目中?我目前没有这样的 XML 文件。
    • 这是一个 MSBuild 可以理解和处理的 XML 文件。您的项目和解决方案文件属于同一品种。在您的解决方案附近/中拥有此类文件让生活更轻松
    • 所以我刚试过这个,发布似乎工作。但是,它似乎没有应用转换。当我手动发布时,我的 web.config 已正确转换。知道我能做什么吗?
    【解决方案2】:

    这几个月后我找到了我一直在寻找的解决方案here

    如果上面的链接坏了,下面是它所说的内容:

    卸载然后编辑您的项目文件。查找它正在导入 Microsoft.WebApplication.targets 的行。看起来像:

    &lt;Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /&gt;

    在该行下方,粘贴此 XML:

    <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>
    

    现在,在与项目文件相同的文件夹中的命令提示符下运行它:

    msbuild TestWebApp.csproj "/p:Platform=AnyCPU;Configuration=Debug;PublishDestination=C:\pub" /t:PublishToFileSystem

    记得在命令中指定 MSBUILD 的路径,或者将路径添加到你的全局路径环境变量(我就是这样做的)。在我的机器上,它就在这里:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319

    为了测试这一点,我在我的 Web.Release.config 中放置了一个配置转换来添加一个 AppSetting 键(如果你这样做,请确保 AppSettings 节点存在于你的基本配置文件中,否则你会得到一个错误)。当我使用上述命令构建调试配置时,密钥未按预期出现在已发布的配置文件中。但是,当我使用发布配置时,密钥已成功添加到文件中。

    我真希望微软没有把这件事搞糊涂。无论如何,这是我在互联网上找到的最简单的解决方案。希望对大家有所帮助。

    【讨论】:

    • 未标记为答案。显然,当您在 Web 应用程序中引用另一个项目时,这不起作用。正在研究它,当我找到答案时会发布更新。
    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 2011-02-25
    • 2011-06-21
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多