Ответ 1
Существует, вероятно, нет встроенного способа сделать это (ни один из файлов MSBuild, установленных какой-либо версией VS, не выполняет сборку проектов, и там есть запросы для него как этот). Довольно быстрое решение заключается в создании файла msbuild, который создает ссылочный проект как событие предварительной сборки и включает этот файл в каждый проект, который ссылается на другой проект. Например, создайте файл с именем buildprojectreferenecs.targets в каталоге с общими инструментами сборки или так, с содержимым
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="BuildProjectReferences" BeforeTargets="BuildGenerateSources">
<MsBuild Projects="@(ProjectReference)"
Properties="Configuration=$(Configuration);Platform=$(Platform)"/>
</Target>
</Project>
Это просто создает каждый ProjectReference с той же конфигурацией и платформой, что и проект, включая его. Импортируйте это в каждый проект, который использует ссылки на проект. Импорт должен произойти после того, как элемент ProjectReference определен, так что поставьте его, например. все в нижней части:
...
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <!-- this is near the bottom already -->
<Import Project="..\BuildProjectReferences.targets" /> !<-- add this -->
...
</Project>
Теперь, если вы запустите сборку, прежде чем начнется фактическая компиляция, произойдет построение проектов, на которые ссылаются (и их проекты, на которые ссылаются, и т.д.), независимо от того, находятся ли они в решении или нет. Некоторые недостатки:
- Если вы добавите ссылку на проект, но забудьте импортировать этот файл, ничего не произойдет
- сборка происходит безоговорочно, поэтому, если исходный проект уже построен, сборка снова запускается; хотя он также завершится сразу же после того, как система сборки увидит все выходы в актуальном состоянии.
- система сборки в VS не будет обнаруживать изменения в ссылочных проектах за пределами решения, поэтому, если все проекты в решении обновлены и вы измените исходный файл в проекте, на который ссылаетесь, вне решения, которое оно выиграло Не будет построено. Это не относится к сборке командной строки, хотя там будет запущена сборка проектов, и, следовательно, будут также созданы проекты, на которые ссылаются.
В целом, я не уверен, стоит ли это. Поскольку вы выбрали подход "одного главного решения", возможно, решение действительно должно быть единственным решением для проекта и как таковое должно содержать все зависимости, которые построены из источника. И это задача разработчиков, чтобы убедиться, что это происходит. Чтобы уловить неудачи, чтобы сделать так быстро, лучшим решением является наличие сервера сборки, который строит каждую фиксацию в кодовой базе и, как следствие, быстро обнаруживает ошибки. Затем разработчики уведомляются об их ошибках и вскоре приступят к исправлению (тем более, что это тривиально).