AppendTargetFrameworkToOutputPath завершается ошибкой в ​​файлах .targets - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь централизовать некоторые конфигурации сборки для многих проектов, и решение MSBuild для этого заключается в использовании .targets файлов .

Одна конфигурация, которая мне нужнаприменить ко всем проектам, значит запретить netcoreapp2.1 добавлять ко всем выходным каталогам.Для этого достаточно включить одну строку конфигурации:

<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>

Однако, когда я помещаю эту строку в файл Common.targets и включаю этот файл в мой файл .csproj, используя <Import Project="PathToCommonTargets" />, тогда это не имеет никакого эффекта, и я все еще получаю netcoreapp2.1 в конце моей выходной папки.

Как мне решить эту проблему?

Причина обновления: Мы являемся компанией, которая является техническим партнером для более чем 10 других компаний.То есть, у нас есть центральный источник контроля для инфраструктуры (скажем, сопоставленный с C:\Infra), и для каждой компании отдельный источник контроля (скажем, сопоставленный с C:\CompanyA и C:\CompanyB и т. Д.), Который может содержатьдо 100 решений, каждое из которых может содержать более 10 проектов.Итак, наше первоочередное требование - максимально сократить расходы за счет СУШКИ всего, от Angular до Java, Swift и .NET.Основываясь на духе непрерывного совершенствования, мы не хотим, чтобы наши выходные данные помещались в \bin\Debug\netcoreapp2.1 для более чем 2000 файлов проектов (и увеличиваются), чтобы сократить время, которое наши разработчики тратят на переход к выходной папке, а также осуществлять рефакторинг для более высоких версий.NET проще и дешевле.Чтобы перейти с netcoreapp2.0 на netcoreapp2.1, у нас были кошмары из-за путей вывода в нашей автоматизации.Вот почему мы попытались использовать AppendTargetFrameworkToOutputPath.Но я действительно разочарован тем, почему все должно быть так сложно.Для меня MSBuild должен сначала загрузить все, а затем начать сборку.Таким образом, булев атрибут будет присутствовать повсюду в процессе сборки и не будет нуждаться в такой большой сложности для настройки.В конце концов, какой смысл использовать логический атрибут, если для его настройки требуется больше true/false?

1 Ответ

0 голосов
/ 06 декабря 2018

AppendTargetFrameworkToOutputPath не работает в файлах .targets

Свойство AppendTargetFrameworkToOutputPath может остановить MSBuild, добавляя TargetFramework к OutputPath, но поскольку папка TargetFramework уже была создана, когда мысоздал проект, нам нужно вручную удалить папку TargetFramework после добавления <Import Project="PathToCommonTargets" /> в проект, в противном случае эта папка всегда будет там, тогда мы могли бы построить проект без TargetFramework до OutputPath.

Если папка TargetFramework все еще создается после ее удаления, вы должны удвоить содержимое .targets, и оператор импорта верен.Чтобы убедиться в этом, я добавляю тестовую настраиваемую цель в файл .target:

<?xml version="1.0" encoding="utf-8"?>

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>    
    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> 
  </PropertyGroup>

  <Target Name="Test" AfterTargets="Build">
    <Message Text="This is Test Custom Target!"></Message>
  </Target>

</Project>

Когда мы собираем проект, и мы можем видеть информацию о сообщении в окне вывода, это означает, что содержимое.targets и оператор импорта верны.

Обновление:

Не могли бы вы мне помочь, как удалить TargetFramework?

Для этого выгрузите свой проект.Затем в самом конце проекта, непосредственно перед конечным тегом </project>, поместите ниже сценарии:

<Target Name="RemoveDirectories" AfterTargets="Build">  
    <RemoveDir  
        Directories="$(ProjectDir)$(OutDir)" /> 
</Target> 

Кроме того, вам необходимо выполнить резервное копирование файлов из TargetFramework в bin \ debug илиПапка bin \ release, поэтому перед задачей удаления нам также необходимо выполнить задачу копирования:

<ItemGroup>  
    <MySourceFiles Include="$(ProjectDir)$(OutDir)\*.*"/>  
</ItemGroup> 

<Copy  
    SourceFiles="@(MySourceFiles)"  
    DestinationFolder="$(ProjectDir)bin\$(ConfigurationName)"  
 /> 

 <RemoveDir  
    Directories="$(ProjectDir)$(OutDir)" />  

Надеюсь, это поможет.

...