如何重命名Web部署?

时间:2014-04-19 09:48:13

标签: msbuild msdeploy msbuild-4.0

我有一个Web应用程序项目:

enter image description here

如您所见,有3个robots.txt文件 - 每个环境一个。还有3个发布配置文件。

现在,对于每个pubxml,我想选择正确的“robots.xxx.txt”文件并将其重命名为“robots.txt”。理想情况下,我想利用MSBuild并在每个pubxml文件中保留配置。

3个发布配置文件中的每一个都使用<WebPublishMethod>MSDeploy</WebPublishMethod>


修改

刚试过Richard Szalay answer,但无济于事。所有3个文件仍然复制到输出目录。这就是我的发布配置文件现在的样子

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <WebPublishMethod>FileSystem</WebPublishMethod>
        <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
        <LastUsedPlatform>Any CPU</LastUsedPlatform>
        <SiteUrlToLaunchAfterPublish />
        <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
        <PrecompileBeforePublish>True</PrecompileBeforePublish>
        <EnableUpdateable>True</EnableUpdateable>
        <DebugSymbols>False</DebugSymbols>
        <WDPMergeOption>DonotMerge</WDPMergeOption>
        <ExcludeApp_Data>True</ExcludeApp_Data>
        <publishUrl>C:\Temp\myproject</publishUrl>
        <DeleteExistingFiles>False</DeleteExistingFiles>
    </PropertyGroup>

    <ItemGroup>
        <MsDeployReplaceRules Include="robots">
            <ObjectName>filePath</ObjectName>
            <Match>robots\.debug\.txt</Match>
            <Replace>robots.txt</Replace>
        </MsDeployReplaceRules>
    </ItemGroup>
</Project>

3 个答案:

答案 0 :(得分:3)

您需要的是替换规则。只需将以下内容添加到您的发布配置文件中:

<ItemGroup>
  <MsDeployReplaceRules Include="robots">
    <ObjectName>filePath</ObjectName>
    <Match>robots\.debug\.txt</Match>
    <Replace>robots.txt</Replace>
  </MsDeployReplaceRules>
</ItemGroup>

如果文件命名约定与您的发布配置文件匹配,您也可以在Web应用程序的根目录中创建一个Robots.wpp.targets文件,并使用以下命令:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <MsDeployReplaceRules Include="robots">
      <ObjectName>filePath</ObjectName>
      <Match>robots\.$(PublishProfileName)\.txt</Match>
      <Replace>robots.txt</Replace>
    </MsDeployReplaceRules>
  </ItemGroup>
</Project>   

答案 1 :(得分:2)

我不知道这在技术上是否正确,但它对我有用。

pubxml文件中,在PropertyGroup节点下添加此节点:

<Target Name="MoveRobotsTxt" AfterTargets="GatherAllFilesToPublish">
  <Move Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " SourceFiles="obj\$(ConfigurationName)\Package\PackageTmp\robots.release.txt" DestinationFiles="obj\$(ConfigurationName)\Package\PackageTmp\robots.txt" />
  <Delete Files="obj\$(ConfigurationName)\Package\PackageTmp\robots.release.txt" />
</Target>

如果您使用的不仅仅是Release,则需要复制Move命令并将Release|AnyCPU更改为您的构建名称或使用特殊变量$(ConfigurationName) )。

由于您没有现有的robots.txt,只有在发布版本发布时才需要替换,您可能需要:

<Target Name="MoveRobotsTxt" AfterTargets="GatherAllFilesToPublish">
  <Move SourceFiles="obj\$(ConfigurationName)\Package\PackageTmp\robots.$(ConfigurationName).txt" DestinationFiles="obj\$(ConfigurationName)\Package\PackageTmp\robots.txt" />
</Target>

对我来说,大啊哈,我意识到pubxml就像一个项目文件,你可以使用你用于msbuild的所有命令。

在尝试解决这个问题的同时,我看到2010年到2012年之间有一些变化,这可能解释了为什么理查德的答案不起作用。

修改

我的原始答案由于某种原因没有与MSBuild一起使用,MSBuild和Visual Studio之间的管道似乎有所不同。

发布配置文件中的目标也没有运行。所以我编辑了项目文件,在注释掉BeforeBuild / AfterBuild之后添加了这个文件:

<Target Name="move_robots_in_msbuild"  AfterTargets="PipelinePreDeployCopyAllFilesToOneFolder">
  <Move Condition=" '$(Configuration)' == 'Live' " SourceFiles="obj\$(ConfigurationName)\Package\PackageTmp\robots.live.txt" DestinationFiles="obj\$(ConfigurationName)\Package\PackageTmp\robots.txt" />
  <Delete Files="obj\$(ConfigurationName)\Package\PackageTmp\robots.live.txt" />
</Target>
<Target Name="move_robots_in_visual_studio" AfterTargets="GatherAllFilesToPublish">
  <Move Condition=" '$(Configuration)' == 'Live' " SourceFiles="obj\$(ConfigurationName)\Package\PackageTmp\robots.live.txt" DestinationFiles="obj\$(ConfigurationName)\Package\PackageTmp\robots.txt" />
  <Delete Files="obj\$(ConfigurationName)\Package\PackageTmp\robots.live.txt" />
</Target>

答案 2 :(得分:1)

今天早上我遇到了同样的问题,但上面提供的两个答案对我来说也不起作用。

最后我遵循了这篇文章 - http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/deploying-extra-files

然后在我的调试,发布和暂存.pubxml文件中的</Project>标记之前添加了此标记,并相应地重命名robots.release.txt:

  <Target Name="CustomCollectFiles">
    <ItemGroup>
      <_CustomFiles Include="robots.release.txt" />
      <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
        <DestinationRelativePath>%(RecursiveDir)robots.txt</DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
  </Target>
  <PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>

    <CopyAllFilesToSingleFolderForMsdeployDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForMsdeployDependsOn>
  </PropertyGroup>