У меня есть 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 ==========