2013-05-11 2 views
1

У меня есть asp.net 4 проекта изменен, чтобы применить пользовательские преобразования:Применение TransformXml после файлы были скопированы в каталог веб-пакет

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    ... 
    <None Include="Configuration\System.Debug.xml"> 
    <DependentUpon>System.xml</DependentUpon> 
    </None> 
    <Content Include="Configuration\System.xml"> 
    <TransformOnBuild>true</TransformOnBuild> 
    </Content> 
    ... 
    <Import Project="$(SolutionDir)\MsBuild\TransformFiles.targets" /> 
</Project> 

Трансформация логика определяется в отдельном файле:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 
    <ItemDefinitionGroup> 
    <!-- Set the default value to false here --> 
    <None> 
     <TransformOnBuild>false</TransformOnBuild> 
    </None> 
    <Content> 
     <TransformOnBuild>false</TransformOnBuild> 
    </Content> 
    <Resource> 
     <TransformOnBuild>false</TransformOnBuild> 
    </Resource> 
    <EmbeddedResource> 
     <TransformOnBuild>false</TransformOnBuild> 
    </EmbeddedResource> 

    <_FilesToTransform> 
     <IsAppConfig>false</IsAppConfig> 
    </_FilesToTransform> 
    </ItemDefinitionGroup> 

    <PropertyGroup> 
    <TransformAllFilesDependsOn> 
     DiscoverFilesToTransform; 
    </TransformAllFilesDependsOn> 
    </PropertyGroup> 

    <Target Name="TransformAllFiles" DependsOnTargets="$(TransformAllFilesDependsOn)" AfterTargets="Build;_CopyAppConfigFile"> 
    <!-- Now we have the item list _FilesToTransformNotAppConfig and _AppConfigToTransform item lists --> 
    <!-- Transform the app.config file --> 

    <ItemGroup> 
     <_AppConfigTarget Include="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')" /> 
    </ItemGroup> 

    <PropertyGroup> 
     <_AppConfigDest>@(_AppConfigTarget->'%(FullPath)')</_AppConfigDest> 
     <_PkgPathFull>$([System.IO.Path]::GetFullPath($(WPPAllFilesInSingleFolder)))</_PkgPathFull> 
    </PropertyGroup> 

    <MakeDir Directories="@(_FilesToTransformNotAppConfig->'$(_PkgPathFull)\%(RelativeDir)')" 
     Condition="Exists('%(RootDir)%(Directory)%(Filename).$(Configuration)%(Extension)')"/> 

    <TransformXml Source="@(_AppConfigToTransform->'%(FullPath)')" 
       Transform="%(RelativeDir)%(Filename).$(Configuration)%(Extension)" 
       Destination="$(_AppConfigDest)" 
       Condition=" Exists('%(RelativeDir)%(Filename).$(Configuration)%(Extension)') " /> 


    <TransformXml Source="@(_FilesToTransformNotAppConfig->'%(FullPath)')" 
       Transform="%(RootDir)%(Directory)%(Filename).$(Configuration)%(Extension)" 
       Destination="$(_PkgPathFull)\%(RelativeDir)%(Filename)%(Extension)" 
       Condition=" Exists('%(RootDir)%(Directory)%(Filename).$(Configuration)%(Extension)') "/> 
    </Target> 

    <Target Name="DiscoverFilesToTransform"> 
    <ItemGroup> 
     <_FilesToTransform Include="@(None);@(Content);@(Resource);@(EmbeddedResource)" 
        Condition=" '%(TransformOnBuild)' == 'true' "/> 
    </ItemGroup> 

    <PropertyGroup> 
     <_AppConfigFullPath>@(AppConfigWithTargetPath->'%(RootDir)%(Directory)%(Filename)%(Extension)')</_AppConfigFullPath> 
    </PropertyGroup> 

    <!-- Now look to see if any of these are the app.config file --> 
    <ItemGroup> 
     <_FilesToTransform Condition=" '%(FullPath)'=='$(_AppConfigFullPath)' "> 
     <IsAppConfig>true</IsAppConfig> 
     </_FilesToTransform> 
    </ItemGroup> 

    <ItemGroup> 
     <_FilesToTransformNotAppConfig Include="@(_FilesToTransform)" 
           Condition=" '%(IsAppConfig)'!='true'"/> 

     <_AppConfigToTransform Include="@(_FilesToTransform)" 
          Condition=" '%(IsAppConfig)'=='true'"/> 
    </ItemGroup> 
    </Target> 
</Project> 

Проблема заключается в том, что преобразование применяется перед процессом публикации, поэтому преобразованные файлы переопределяются источником:

1>------ Build started: Project: TestProject, Configuration: Debug Any CPU ------ 
... 
1>TransformAllFiles: 
1> Transforming Source File: C:\sorces\TestProject\Configuration\System.xml 
1> Applying Transform File: C:\sorces\TestProject\Configuration\System.Debug.xml 
1> Output File: C:\sorces\TestProject\obj\Debug\Package\PackageTmp\Configuration\System.xml 
1> Transformation succeeded 
1> 
1>Build succeeded. 
1> 
1>Time Elapsed 00:00:01.42 
2>------ Publish started: Project: TestProject, Configuration: Debug Any CPU ------ 
... 
2>Copying Configuration\System.xml to obj\Debug\Package\PackageTmp\Configuration\System.xml. 
... 

Есть ли способ применить преобразования после того, как файлы были скопированы в каталог пакетов? Я пробовал разные рекомендации, но не повезло.

Обновление 1: Интересная вещь: Файл TransformFiles.targets не анализируется в процессе публикации вообще. Я сделал ошибку в файле:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Message-bla-bla Importance="high" Text="test001" /> 
</Project> 

Так строить не удалось:

1>------ Build started: Project: TestProject, Configuration: Debug Any CPU ------ 
1>Build started 11.05.2013 10:18:56. 
1>C:\sources\TestProject\MsBuild\TransformFiles.targets(3,3): error MSB4067: The element <Message-bla-bla> beneath element <Project> is unrecognized. 
1> 
1>Build FAILED. 
1> 
1>Time Elapsed 00:00:00 
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ========== 

Но опубликовывает удалось (!!!):

1>------ Publish started: Project: TestProject, Configuration: Debug Any CPU ------ 
... 
1>Publish is successfully deployed. 
1> 
========== Build: 0 succeeded, 0 failed, 2 up-to-date, 0 skipped ========== 
========== Publish: 1 succeeded, 0 failed, 0 skipped ========== 

ответ

0

Есть 2 исправления:

1 Изменение свойства AfterTargets:

<Target Name="TransformAllFiles" DependsOnTargets="$(TransformAllFilesDependsOn)" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy;"> 

2 Перезапустите Visual Studio (!).

Смежные вопросы