Как мне указать платформу для MSBuild?

Я пытаюсь использовать MSBuild для создания решения с указанной целевой платформой (мне нужны оба бинарных файла, x86 и x64). Вот как я это попробовал:

C:\WINDOWS\Microsoft.NET\Framework\v3.5>MsBuild SolutionPath\Solution.sln /t:Rebuild /p:Configuration=Release /p:Platform="x86"

Однако сборка всегда дает сбой, если платформа отличается от "Любого процессора". Что я делаю неправильно?

Это время вывода MSBuild печатает:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: перестроить /p: конфигурация = выпуск /p: платформа ="x86" Microsoft (R) Build Engine версии 3.5.30729.1 [Microsoft .NET Framework, версия 2.0.50727.3082] Copyright (C) Microsoft Corporation 2007. Все права защищены.

Сборка началась 1.7.2010 8:28:10. Проект "SolutionPath\Solution.sln" на узле 0 (перестроить цель t(s)). SolutionPath\Solution.sln: ошибка MSB4126: указана недопустимая конфигурация решения "Release|x86". Укажите допустимое значение конфигурации решения, используя свойства Configuration и Platform (например, MSBuild.exe Solution.sln /p:Configuration=Debug /p:Platform="Any CPU") или оставьте эти свойства пустыми, чтобы использовать конфигурацию решения по умолчанию. Готово Создание проекта "SolutionPath\Solution.sln" (перестроить объект (ы)) - СБОЙ.

Сборка не удалась.

"SolutionPath\Solution.sln" (цель перестроения) (1) -> (цель ValidateSolutionConfiguration) -> SolutionPath\Solution.sln: ошибка MSB4126: указанная конфигурация решения "Release|x86" недопустима. Укажите допустимую конфигурацию решения, используя свойства Configuration и Platform (например, MSBuild.ex e Solution.sln /p: Configuration = Debug /p: Platform = "Any CPU"), или оставьте эти свойства пустыми, чтобы использовать конфигурацию решения по умолчанию.

0 Warning(s)
1 Error(s)

Прошедшее время 00:00:00.03

Если я пытаюсь собрать его для x86/x64 с помощью devenv, он работает отлично, однако я пытаюсь настроить сервер сборки без установки всех необходимых версий Visual Studio. Кстати, если есть лучший бесплатный инструмент (который поддерживает.NET Framework 4), я бы хотел услышать об этом.

8 ответов

Решение

Если вы хотите создать решение для x86 и x64, оно должно быть настроено для обеих платформ. На самом деле у вас просто есть конфигурация Any CPU.

Как проверить доступную конфигурацию для проекта

Чтобы проверить доступную конфигурацию для данного проекта, откройте файл проекта (*.csproj например) и искать PropertyGroup с правом Condition,

Если вы хотите встроить Release режим для x86, у вас должно быть что-то вроде этого в вашем файле проекта:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
  ...
</PropertyGroup>

Как создать и изменить конфигурацию в Visual Studio

http://i.msdn.microsoft.com/Cc563937.11a492fe-e240-4cdd-9b53-b6aae7224b09(en-us,office.12).jpg

http://blogs.msdn.com/blogfiles/habibh/WindowsLiveWriter/9d46e66e51d6_13278/image_15.png

http://blogs.msdn.com/blogfiles/habibh/WindowsLiveWriter/9d46e66e51d6_13278/image_18.png

Как создать и редактировать конфигурацию (на MSDN)

В MSBuild или Teamcity используйте командную строку

MSBuild yourproject.sln /property:Configuration=Release /property:Platform=x64

или используйте более короткую форму:

MSBuild yourproject.sln /p:Configuration=Release /p:Platform=x64

Однако вам все равно нужно настроить платформу в своем проекте, см. Ответ Жюльена Хорау.

Если вы пытаетесь сделать это из командной строки, вы можете столкнуться с проблемой, когда переменная среды платформы "Платформа" устанавливается для вас и работает против вас. Я могу воспроизвести это, если я использую окно команд VS2012 вместо обычного окна команд Windows.

В командной строке введите:

установить платформу

В командном окне VS2012 у меня есть предустановленное значение "X64". Кажется, это мешает тому, что находится в моем файле решения.

В обычном командном окне команда 'set' приводит к сообщению "переменная не определена"... что хорошо.

Если результат вашей команды 'set', приведенной выше, не возвращает значения переменной окружения, вам стоит пойти дальше.

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

Для платформы я указывал «Любой процессор», изменил его на «Любой процессор», и это решило проблему.

      msbuild C:\Users\Project\Project.publishproj /p:Platform="AnyCPU"  /p:DeployOnBuild=true /p:PublishProfile=local /p:Configuration=Debug

Если вы посмотрите на свой файл .csproj, вы увидите правильное имя используемой платформы.

В VS2017 у меня есть странный случай с пробелом между Any и CPU. это не об использовании командной строки.

Если у вас есть файл проекта сборки, который может вызывать другие файлы решения. Вы можете попробовать добавить пробел между Any и CPU, например так (значение свойства Platform):

<MSBuild Projects="@(SolutionToBuild2)" Properties ="Configuration=$(ProjectConfiguration);Platform=Any CPU;Rerun=$(MsBuildReRun);" />

Прежде чем я исправлю эту проблему сборки, это будет примерно следующее (ProjectPlatform - глобальная переменная, для которой задано значение AnyCPU):

<MSBuild Projects="@(SolutionToBuild1)" Properties ="Configuration=$(ProjectConfiguration);Platform=$(ProjectPlatform);Rerun=$(MsBuildReRun);" />

Кроме того, у нас есть много проектов, которые вызываются с использованием $ (ProjectPlatform), который является AnyCPU, и работают нормально. Если мы откроем файл proj, мы увидим строки вроде этого, и это имеет смысл.

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">

Итак, мой вывод: "AnyCPU" работает для вызова файлов проекта, но не для вызова файлов решения, для вызова файлов решений с использованием "Любой процессор" (добавьте пробел).

На данный момент я не уверен, является ли это ошибкой файла проекта VS или MSBuild. Я использую VS2017 с установленными инструментами сборки VS2017.

Для VS2017 и 2019... с файлами проекта SDK современной основной библиотеки платформу можно изменить в процессе сборки. Вот пример перехода наanycpu платформа, непосредственно перед встроенной CoreCompile задача запускается:

<Project Sdk="Microsoft.NET.Sdk" >

  <Target Name="SwitchToAnyCpu" BeforeTargets="CoreCompile" >
    <Message Text="Current Platform=$(Platform)" />
    <Message Text="Current PlatformTarget=$(PlatformName)" />
    <PropertyGroup>
      <Platform>anycpu</Platform>
      <PlatformTarget>anycpu</PlatformTarget>
    </PropertyGroup>
    <Message Text="New Platform=$(Platform)" />
    <Message Text="New PlatformTarget=$(PlatformTarget)" />
  </Target>

</Project>

В моем случае я создаю FPGA с BeforeTargets а также AfterTargets задач, но компиляция приложения C# в основном CoreCompile. (отчасти потому, что мне может понадобиться какое-то приложение командной строки, а отчасти потому, что я не мог понять, как пропустить или переопределитьCoreCompile)

Для сборки нескольких параллельных двоичных файлов, таких как x86 и x64: потребуется либо отдельная задача сборки вручную, либо два отдельных файла проекта с соответствующими <PlatformTarget>x86</PlatformTarget> а также <PlatformTarget>x64</PlatformTarget> настройки в примере выше.

В Visual Studio 2019 версии 16.8.4 вы можете просто добавить

      <Prefer32Bit>false</Prefer32Bit>

Когда вы определяете различные конфигурации сборки в решении Visual Studio для своих проектов с помощью такого инструмента, как https://github.com/golavr/ConfigurationTransform, вы можете захотеть, чтобы ваша сборка Teamcity построила вам указанную конфигурацию сборки. У вас могут быть определенные конфигурации сборки, например Debug, Release, Dev, UAT, Prod и т. Д. Это означает, что у вас будет настройка преобразования конфигурации MSBuild для различных конфигураций. Эти разные конфигурации обычно используются, когда у вас разные конфигурации, например, разные строки подключения к базе данных, для разной среды. Это очень часто, потому что у вас будет база данных для вашей производственной среды, отличная от вашей игровой среды разработки.

Говорят, что картинка стоит тысячи слов, пожалуйста, посмотрите изображение ниже, как вы можете указать несколько конфигураций сборки в Teamcity.

В текстовом поле ввода командной строки укажите, как показано ниже

/p:OutputPath=Publish;Configuration=Dev

Здесь я указал две конфигурации / аргументы сборки командной строки OutputPath и построить Configuration с ценностями Publish а также Dev соответственно, но это могло быть, UAT или Prodконфигурация. Если вы хотите больше, просто разделите их точкой с запятой,;

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