xbuild не встраивает ресурсы из общего проекта
У меня есть проект C# A, расположенный в FolderA, который ссылается на общий проект B. Файлы общего проекта находятся в FolderB. Общий проект B содержит файл C.gz со свойствами
Встроенный ресурс Build Action
Копировать в выходной каталог Не копировать
Когда я пытаюсь построить проект A с использованием xbuild (в частности, версий 4.8 и 4.8.1, архитектуры x86 и x64):
xbuild A.csproj
Я получаю следующую ошибку сборки:
C: \ Program Files (x86) \ Mono \ lib \ mono \ xbuild \ 14.0 \ bin \ Microsoft.Common.targets (цель CopyNonResxEmbeddedResources) ->
C: \ Program Files (x86) \ Mono \ lib \ mono \ xbuild \ 14.0 \ bin \ Microsoft.Common.targets: error: невозможно скопировать FolderA\C.gz в FolderA\obj\Release\C.gz в качестве источника файл не существует
то есть xbuild выполняет поиск файла встроенного ресурса в FolderA, хотя он, очевидно, находится в FolderB вместе с другими файлами общего проекта B.
Я не могу переместить файл встроенного ресурса в проект A, поскольку на общий проект ссылаются также и на несколько других проектов.
Есть ли что-то еще, что я могу сделать для успешной сборки проекта A с помощью xbuild?
Примечание: это ожидаемое поведение в xbuild или ошибка? С msbuild у меня нет этой проблемы.
1 ответ
Эта проблема является недостатком в текущей реализации xbuild, поэтому мне нужно было применить обходной путь, специфичный для этой проблемы.
Поскольку xbuild ожидает, что встроенный файл ресурсов будет доступен в папке FolderA, я просто добавляю этап предварительной сборки в файл проекта:
<ItemGroup>
<FilesToCopy Include="..\FolderB\C.gz" />
</ItemGroup>
<Target Name="BeforeBuild">
<Copy SourceFiles="@(FilesToCopy)" DestinationFolder="."/>
</Target>
При желании можно также рассмотреть возможность очистки после сборки, удалив скопированный файл в пост-сборке.
Заметка! Чтобы убедиться, что шаг перед сборкой правильно учтен, поместите его после этой строки:
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />