Когда мне нужно передать MSBuild файл решения?

Из командной строки, когда я буду вызывать MSBuild непосредственно для проекта, и когда я буду вызывать MSBuild для проекта sln файл, передавая /t:Build /t:ProjectName?

Пример: у меня есть простое решение, содержащее несколько проектов (A, B, C, ...). Разработка осуществляется через графический интерфейс VS, открывая и работая с решением.

Теперь, в конкретном автоматическом случае, я хочу собрать только проект B из командной строки:

Как мне позвонить?:

(А) MSBuild "my.sln" "/t:Build" "/t:ProjB" "/p:Configuration=Release" "/p:Platform=Any CPU"

(Б) MSBuild "ProjB.vcxproj" "/t:Build" "/p:Configuration=Release" "/p:Platform=Any CPU"

  • Будет ли разница в результате?
  • Могут ли быть какие-либо дополнительные настройки в sln файл, который пропускается таким образом? (Я конечно не вижу никакой дополнительной информации в нашем VS2015 sln файл.)
  • Если решение большое, но у ProjB мало взаимозависимостей с другими проектами решения, будет ли один вариант быстрее?

2 ответа

Решение

Пока я могу определить эти проблемы:

  • Совершенно очевидно, если у вас есть дополнительные sln основанные на зависимостях, они будут просто игнорироваться.
    • В наши дни вы действительно должны работать с зависимостями project2project, но я думаю, что в некоторых случаях есть несколько веских причин придерживаться решения проблем.
  • Макро значения. Начиная с $(SolutionFileName)и все остальное, что начинается с решения. Если ваш проект или его зависимости используют любой из них: может получиться несколько иной результат.
  • Платформа. Боже мой Видите ли, они работают так, как работают платформы решений, в основном они представляют собой именованные контейнеры для группировки выбранных платформ проектов.

    Что это значит, особенно для C++, что при вызове sln Возможно, вам потребуется указать другую платформу. Например, с решением вы бы построили "Смешанные платформы" или, может быть, "Любой процессор", но для проекта вам действительно нужно указать x64 или же Win32,

    Таким образом, Платформа, которая должна быть принята, может отличаться.

Как мне позвонить? Будет ли разница в результате? Могут ли быть какие-либо дополнительные настройки в файле sln, которые пропускаются таким образом?

Это углубляется в том, как вы выразили зависимости между проектами, используете решение для выражения зависимостей между проектами или добавили ссылки на проект?

Если вы используете решение для выражения зависимостей между проектами, вам следует вызвать командную строку (a). Если вы вызываете командную строку (b), проекты зависимостей будут игнорироваться. Поскольку файл решения используется для внутреннего анализа временного файла проекта в MSBuild, поэтому, если вы строите проект с помощью ProjB.vcxprojинформация об этих зависимостях будет игнорироваться.

Например, я создал решение с тремя проектами, TestSample, TestSampleB, TestSampleC, Используя решение, чтобы добавить TestSampleB, TestSampleC ссылка на TestSample (Щелкните правой кнопкой мыши свое решение-> Свойства-> Общие свойства-> Зависимости проекта):

Когда мы строим проект TestSample с (б) командной строки, только проект TestSample был построен, TestSampleB, TestSampleC были проигнорированы.

MSBuild "TestSample\TestSample.vcxproj"

Когда мы вызываем командную строку (a), все зависимости проекта были построены:

MSBuild "TestSample.sln" /t:"TestSample"

Если вы добавите ссылки в проект (щелкните правой кнопкой мыши проект-> Добавить ссылку), вы можете вызвать обе из двух командных строк. Все зависимости проекта будут построены.

Итак, если вы выражаете зависимости между проектами с помощью файла sln, я рекомендую встраивать эти зависимости непосредственно в файлы proj и удалять их из sln. Это позволит вам вызывать любой файл proj из MSBuild напрямую, и все проекты будут создаваться независимо без какой-либо дополнительной работы.

Если решение большое, но у ProjB мало взаимозависимостей с другими проектами решения, будет ли один вариант быстрее?

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

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

Другие вопросы по тегам