Msbuild 如何为web部署重命名?

Msbuild 如何为web部署重命名?,msbuild,msdeploy,msbuild-4.0,Msbuild,Msdeploy,Msbuild 4.0,我有一个web应用程序项目: 如您所见,有3个robots.txt文件-每个环境一个。还有3个发布配置文件 现在,对于每个pubxml,我想选择正确的“robots.xxx.txt”文件并将其重命名为“robots.txt”。理想情况下,我希望利用MSBuild并将配置保存在每个pubxml文件中 3个发布配置文件中的每一个都在使用MSDeploy 编辑: 只是试了一下,但是没有用。所有3个文件仍复制到输出目录。这就是我的发布配置文件现在的样子 <?xml version="1.0"

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

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

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

3个发布配置文件中的每一个都在使用
MSDeploy


编辑:

只是试了一下,但是没有用。所有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>

文件系统
释放
任何CPU
真的
真的
真的
假的
不要合并
真的
C:\Temp\myproject
假的
文件路径
robots\.debug\.txt
robots.txt

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

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

我不知道这在技术上是否正确,但它对我来说是有效的

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>
对我来说最重要的是认识到
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>

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

最后我看了这篇文章——

然后在my debug、release和staging.pubxml文件中的
标记之前添加此标记,并适当重命名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>

%(RecursiveDir)robots.txt
自定义文件;
$(将所有文件复制到SingleFolderForpPackageDependson);
自定义文件;
$(将所有文件复制到SingleFolderForpPackageDependson);

感谢您的回复。我试过这个代码,但我觉得我做错了什么。请你看一下更新后的问题。你应该得到+2。一个用来说明其他解决方案的是废话。
<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>
  <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>