2014-04-19 16 views
5

Ho un progetto di applicazione web:come rinominare per la distribuzione Web?

enter image description here

Come si può vedere, ci sono 3 file robots.txt - uno per ogni ambiente. Ci sono anche 3 profili di pubblicazione.

Ora, per ciascun pubxml voglio selezionare il file "robots.xxx.txt" corretto e rinominarlo in "robots.txt". Idealmente mi piacerebbe sfruttare MSBuild e mantenere la configurazione all'interno di ogni file pubxml.

Ciascuno dei 3 profili di pubblicazione utilizza <WebPublishMethod>MSDeploy</WebPublishMethod>.


EDIT:

appena provato Richard Szalay answer, tuttavia senza alcun risultato. Tutti e 3 i file sono ancora copiati nella directory di output. Ecco come appare il mio profilo di pubblicazione ora

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

risposta

3

Quello che ti serve è una regola di sostituzione. Basta aggiungere la seguente al tuo profilo di pubblicazione:

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

Se il file convenzione di denominazione soddisfa le vostre profili pubblicare, in alternativa è possibile creare un singolo file Robots.wpp.targets nella root della vostra applicazione web e utilizzare il seguente:

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

Grazie per la risposta. Ho provato il codice, ma penso di fare qualcosa di sbagliato. Potrebbe per favore dare un'occhiata alla domanda aggiornata. – niaher

2

Non ho idea se questo sia tecnicamente il modo giusto, ma funziona per me.

Nel file pubxml, sotto il nodo PropertyGroup aggiungere questo nodo:

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

Se si utilizza più di un semplice Release, è necessario copiare il comando Move e cambiare il Release|AnyCPU al tuo nome o accumulo usa la variabile speciale $ (ConfigurationName).

Come non si dispone di un file robots.txt esistente che si desidera sostituire solo se è la versione di rilascio, probabilmente si vorrà:

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

Il grande ah-ha per me è stato realizzare il pubxml è proprio come un file di progetto e puoi usare tutti gli stessi comandi che usi per msbuild.

Nel tentativo di risolvere questo problema, ho visto alcuni cambiamenti tra il 2010 e il 2012 che potrebbero spiegare perché la risposta di Richard non funziona.

EDIT:

La mia risposta originale non ha funzionato con MSBuild per qualche ragione, la pipeline sembra diverso tra MSBuild e Visual Studio.

Anche gli obiettivi nel profilo di pubblicazione non sono stati eseguiti.Così ho modificato il mio file di progetto aggiungendo questo alla fine dopo il commentata 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> 
0

ho avuto lo stesso problema questa mattina, ma le due risposte fornite sopra non ha funzionato per me.

Alla fine ho seguito questo articolo - http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/deploying-extra-files

poi aggiunti questo markup appena prima del tag nel mio debug, release e messa in scena file .pubxml, rinominare robots.release.txt modo appropriato:

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

I Spero che questo aiuti chiunque si imbatta nello stesso problema.

Problemi correlati