Как расставить приоритеты в проекте в VisualStudio-решении? - PullRequest
0 голосов
/ 26 сентября 2018

У нас есть решение с около 70 проектами.Один из них занимает относительно много времени (~ 10 минут), но не использует системные ресурсы.Мы также используем параллельную сборку, чтобы ускорить процесс.

Когда я (повторно) добавляю этот проект к решению, он находится в конце порядка сборки.Машина компилируется на 100% при компиляции 69 проектов, а затем на 10 минут простаивает при компиляции 70-го.Когда я вручную редактирую .sln-файл, чтобы проект был первым во всех списках, он где-то посередине.Как я могу переместить это в начало?

Это , а не о зависимостях.В этом проекте A есть только один проект B, и я в порядке, если B первый, а A второй.Кроме того, никакие другие проекты не зависят от проекта А.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Как переместить его в начало?

Вы можете создать файл проекта MSBuild с именем "before.<SolutionName>.sln.targets" в той же папке, что и ваше решение.

Затем создайте решение с помощью командной строки (Visual Studio будет игнорировать этот файл.), before.<SolutionName>.sln.targets будет построен до того, как все проекты Visual Studio будут в решении.

В этомВ этом случае нам просто нужно построить этот специальный проект в файле before.<SolutionName>.sln.targets, этот специальный проект будет создан перед всеми проектами в решении.

Содержимое before.<SolutionName>.sln.targets, например:

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

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="BuildSpecialProject" BeforeTargets="Build">
    <Message Text="Build My Specify Project" />

    <MSBuild Projects="Path\YouSpecialName.csproj"/>
</Target>

</Project>

Затем создайте файл решения с помощью командной строки с помощью MSBuild или dotnet:

msbuild /t:build "<SolutionPath>\<SolutionName>.sln"

dotnet build "<SolutionPath>\<SolutionName>.sln"

Проверьте этот поток для получения дополнительной информации.

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

0 голосов
/ 12 октября 2018

VisualStudios sln-файлы очень ограничены и записаны в формате, определенном десятилетия назад.Фактически, он преобразуется в msbuild-скрипт, прежде чем делать что-нибудь полезное.

Для большей гибкости я добавил msbuild-скрипт (master.msbuild) с чем-то похожим на это (непроверенный, но правильная документация доступна )

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
<ItemGroup>  
    <ProjectsToBuild Include="longrunningproject.proj" /> 
    <ProjectToBuild 
        Include="SolutionWithTheOther69Projects.sln"
        Properties="Configuration=Debug;Platform=x86"/>         
</ItemGroup>  

<Target Name="Build" >  
    <MSBuild  
        Projects="@(ProjectsToBuild)"  
        Targets="Build"
        BuildInParallel="true"  
        ContinueOnError="false"
        Properties="VeloxVersion=$(VeloxVersion);RootDir=$(RootDir)"
    />  
</Target>
</Project>

Проекты выполняются в порядке их определения.Пока что нет контроля над тем, что происходит в решении, но я могу ставить проекты впереди или позади него и влиять на порядок сборки.

Если долгосрочная задача вызывается с помощью msbuild-exec-task, онаважно установить флаг YieldDuringToolExecution этой задачи.Например,

<Exec 
        Command="..."
        YieldDuringToolExecution="true"
    />

В противном случае, все начинается параллельно, а затем медленно угасает, пока не будет выполнена exec-задача.Я не мог расшифровать логику, стоящую за этим, но, честно говоря, мне все равно.

После нескольких дней попыток и ошибок сборочная машина кричит при 100% -ной загрузке процессора, медленно спускаясь к одной долгойвыполнение задачи, а затем выполняется. Коэффициент ускорения 2,5: D

0 голосов
/ 26 сентября 2018

Похоже, вы уже пробовали редактировать зависимости проекта в visual studio.Если вы уже отредактировали его, чтобы сначала сделать проект, но это все еще занимает некоторое время, то вам, вероятно, следует просто извлечь его из файла решения.Затем поместите сборку в свой собственный скрипт msbuild, где вы можете использовать параллельные задачи MSBuildExtensions, чтобы он создавался одновременно со всем остальным:

См. https://mikefourie.wordpress.com/2012/02/29/executing-msbuild-targets-in-parallel-part-1/

И я 'Я уверен, что библиотека MSBuildExtensions теперь также является пакетом nuget.

...