如何为 MSBuild 指定平台?
Posted
技术标签:
【中文标题】如何为 MSBuild 指定平台?【英文标题】:How do I specify the platform for MSBuild? 【发布时间】:2011-03-10 11:43:37 【问题描述】:我正在尝试使用 MSBuild 构建具有指定目标平台的解决方案(我需要二进制文件,x86 和 x64)。我就是这样尝试的:
C:\WINDOWS\Microsoft.NET\Framework\v3.5>MsBuild SolutionPath\Solution.sln /t:Rebuild /p:Configuration=Release /p:Platform="x86"
但是,如果平台与“任何 CPU”不同,则构建总是会失败。我做错了什么?
这是 MSBuild 打印的 while 输出:
C:\WINDOWS\Microsoft.NET\Framework\v3.5>MsBuild SolutionPath\Solution.sln /t:重建 /p:配置=发布 /p:Platform="x86" Microsoft (R) 构建 引擎版本 3.5.30729.1 [微软 .NET 框架,版本 2.0.50727.3082] 版权所有 (C) Microsoft Corporation 2007。所有权利 保留。
构建开始于 1.7.2010 8:28:10。 项目“SolutionPath\Solution.sln” 节点 0(重建目标 t(s))。 解决方案路径\解决方案.sln:错误 MSB4126:指定的解决方案 配置“Release|x86”是 无效的。请指定一个有效的 解决方案配置使用 配置和平台属性 (例如 MSBuild.exe Solution.sln /p:配置=调试 /p:Platform="Any CPU") 或离开那些 属性空白以使用默认值 解决方案配置。完成建筑 项目“SolutionPath\Solution.sln” (重建目标)--失败。
构建失败。
“SolutionPath\Solution.sln”(重建 目标)(1)-> (ValidateSolutionConfiguration 目标) -> SolutionPath\Solution.sln : 错误 MSB4126: 指定的解决方案 配置“Release|x86”是 无效的。请指定一个有效的 解决方案配置使用 配置和平台属性 (例如 MSBuild.exe e Solution.sln /p:配置=调试 /p:Platform="Any CPU") 或离开那些 属性空白以使用默认值 解决方案配置。
0 Warning(s) 1 Error(s)
经过时间 00:00:00.03
如果我尝试使用 devenv 为 x86/x64 构建它,它可以完美运行,但是我试图在不安装所有必要版本的 Visual Studio 的情况下设置构建服务器。顺便说一句,如果有更好的免费工具(支持 .NET 框架 4),我很想听听。
【问题讨论】:
它是如何失败的?可能有些项目不支持x86平台? 你确定不需要 /p:Platform="Win32" 吗? 对于来到这里并想知道如何在不安装 Visual Studio 的机器上安装 2017 版 MSBuild 的未来读者,请参阅this other question。 @AndrewWyatt - afaik - C++ 使用Win32
而现代 .NET 使用 x86
@ElliotWoods - 感谢您的澄清:Win32/x86 - 我的观点仅来自 C++ 的观点。
【参考方案1】:
如果您想为 x86 和 x64 构建解决方案,您的解决方案必须针对这两个平台进行配置。实际上你只是有一个Any CPU配置。
如何检查项目的可用配置
要检查给定项目的可用配置,请打开项目文件(例如*.csproj
)并查找右侧为Condition
的PropertyGroup
。
如果你想为x86
构建Release
模式,你的项目文件中必须有这样的东西:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
...
</PropertyGroup>
如何在 Visual Studio 中创建和编辑配置
(来源:microsoft.com)
(来源:msdn.com)
(来源:msdn.com)
How to create and edit the configuration(在 MSDN 上)
【讨论】:
使用x86和x64有什么区别? x86 构建 32 位 dll/可执行文件,x64 构建 64 位 dll/可执行文件。 @Julien 可以/我应该使用 .targets 文件来设置共享配置吗? 一些项目使用Win32
而不是x86
,例如CMake
生成的项目使用(libssh2
使用CMake
)。【参考方案2】:
如果您尝试从命令行执行此操作,您可能会遇到一个问题,即正在为您设置机器范围的环境变量“平台”并且对您不利。如果我使用 VS2012 命令窗口而不是常规 Windows 命令窗口,我可以重现此问题。
在命令提示符下键入:
设置平台
在 VS2012 命令窗口中,我预设了一个“X64”值。这似乎会干扰我的解决方案文件中的任何内容。
在常规命令窗口中,“set”命令会导致“变量未定义”消息...这很好。
如果你上面的“set”命令的结果没有返回环境变量值,你应该很好。
【讨论】:
这当然是 VS2012 x64 命令窗口与 VS2012 x86 命令窗口的区别。 IOW,按照设计,而不是“干涉”【参考方案3】:在 MSBuild 或 Teamcity 中使用命令行
MSBuild yourproject.sln /property:Configuration=Release /property:Platform=x64
或使用更短的形式:
MSBuild yourproject.sln /p:Configuration=Release /p:Platform=x64
无论如何,您都需要在项目中设置平台,请参阅 Julien Hoarau 的回答。
【讨论】:
没有实现 /property 的子设置来识别配置和平台。谢谢 请注意,MSBuild 不考虑 Visual Studio“解决方案配置”,而是在为解决方案的每个项目执行 xxproj 之前设置属性。无论您在 Visual Studio 中选择何种项目配置组合,解决方案的每个项目的平台和配置都是相同的。 或者可能更短:/p:Configuration=Release;AnyOtherParameter=Abc123;Platform=x86 如果它对任何人有帮助,命令行上的多字参数会用双引号括起来。所以Platform="Any CPU"
或Platform="Mixed Platforms"
对于那些需要它的人。【参考方案4】:
对于 VS2017 和 2019... 使用 modern core library SDK project files,可以在构建过程中更改平台。这是一个在内置CoreCompile
任务运行之前更改为anycpu
平台的示例:
<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>
就我而言,我正在构建一个带有BeforeTargets
和AfterTargets
任务的FPGA,但在主CoreCompile
中编译一个C# 应用程序。 (部分是因为我可能想要某种命令行应用程序,部分是因为我不知道如何忽略或覆盖CoreCompile
)
要为多个并发二进制文件(例如 x86 和 x64)构建:需要单独的手动构建任务,或者需要两个单独的项目文件,在上面的示例中分别使用 <PlatformTarget>x86</PlatformTarget>
和 <PlatformTarget>x64</PlatformTarget>
设置。
【讨论】:
【参考方案5】:当您在 Visual Studio 解决方案中使用 ConfigurationTransform 之类的工具为您的项目定义不同的构建配置时,您可能希望您的 Teamcity 构建能够为您构建指定的构建配置。您可能已经定义了构建配置,例如 Debug、Release、Dev、UAT、Prod 等。这意味着,您将为不同的配置设置 MSBuild 配置转换。当您有不同的配置时,通常会使用这些不同的配置,例如不同的数据库连接字符串,用于不同的环境。这很常见,因为您的生产环境与 Playground 开发环境的数据库不同。
他们说一张图片值一千字,请参阅下图,您将如何在 Teamcity 中指定多个构建配置。
在命令行输入文本框中,指定如下
/p:OutputPath=Publish;Configuration=Dev
在这里,我指定了两个命令行构建配置/参数OutputPath
和构建Configuration
,其值分别为Publish
和Dev
,但它可能是UAT
或Prod
配置。如果您想要更多,只需用分号分隔它们,;
【讨论】:
【参考方案6】:我在 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' 适用于调用项目文件,但不适用于调用解决方案文件, 用于调用解决方案文件,使用“任何 CPU”(添加空格。)
目前,我不确定这是 VS 项目文件还是 MSBuild 的错误。 我正在使用安装了 VS2017 构建工具的 VS2017。
【讨论】:
【参考方案7】:希望这对那里的人有所帮助。
对于我指定“Any CPU”的平台,将其更改为“AnyCPU”并解决了问题。
msbuild C:\Users\Project\Project.publishproj /p:Platform="AnyCPU" /p:DeployOnBuild=true /p:PublishProfile=local /p:Configuration=Debug
如果您查看 .csproj 文件,您会看到要使用的正确平台名称。
【讨论】:
【参考方案8】:在 Visual Studio 2019 版本 16.8.4 中,您只需添加
<Prefer32Bit>false</Prefer32Bit>
【讨论】:
以上是关于如何为 MSBuild 指定平台?的主要内容,如果未能解决你的问题,请参考以下文章
如何为msbuild安装nuget.build.tasks.pack.targets
配置 Jenkins 以在 Linux 平台上运行 MSBuild