Msbuild 如何为web部署重命名?
我有一个web应用程序项目: 如您所见,有3个robots.txt文件-每个环境一个。还有3个发布配置文件 现在,对于每个pubxml,我想选择正确的“robots.xxx.txt”文件并将其重命名为“robots.txt”。理想情况下,我希望利用MSBuild并将配置保存在每个pubxml文件中 3个发布配置文件中的每一个都在使用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"
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>