Дать и задачу MSBuild, которая выполняется в AfterTargets="AfterCompile"
, и создает некоторые файлы, как вы можете получить эти файлы для вывода в текущие проекты, чтобы файлы были скопированы в бен каталог любых проектов, ссылающихся этот проектКак добавить файлы в выходные файлы проектов из задачи MSBuild
ответ
у меня нет никаких гарантий, что это правильное решение, но это похоже на работу:
<Target Name="MyTarget" AfterTargets="AfterCompile">
<PropertyGroup>
<MyInput>D:\1.txt</MyInput>
<MyOutput>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)$(OutDir)\1.txt'))</MyOutput>
</PropertyGroup>
<Copy SourceFiles="$(MyInput)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
<ItemGroup>
<AllItemsFullPathWithTargetPath Include="$(MyOutput)">
<TargetPath>1.txt</TargetPath>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</AllItemsFullPathWithTargetPath>
</ItemGroup>
</Target>
соответствующая логика здесь: http://source.roslyn.io/#MSBuildTarget=GetCopyToOutputDirectoryItems http://source.roslyn.io/#MSBuildItem=AllItemsFullPathWithTargetPath
В основном мы полагаемся на то, что для определения списка файлов для копирования из зависимых проектов MSBuild вызывает целевой объект GetCopyToOutputDirectoryItems зависимых проектов и использует его вывод (который является AllItemsFullPathWithTargetPath).
Добавляя себя в AllItemsFullPathWithTargetPath, мы получаем в последний момент, когда нас называет зависимый проект.
Обратите внимание, что задача копирования в MyTarget не нужна, она просто притворяется «сгенерированной» 1.txt в выводе первого проекта. –
Если вы знаете пути к файлам перед компиляцией, вы можете добавить цель с помощью BeforeTargets = «AssignTargetPaths» и заполнить в ней элемент ItemGroup, если метаданные CopyToOutputDirectory установлены в true, они будут скопированы в зависимости от проектов. Я не сразу знаю, как это сделать после компиляции. – stijn