我有一个Web应用程序项目:
如您所见,有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>
答案 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>