MSBUILD : 错误 MSB1008: 只能指定一个项目

Posted

技术标签:

【中文标题】MSBUILD : 错误 MSB1008: 只能指定一个项目【英文标题】:MSBUILD : error MSB1008: Only one project can be specified 【发布时间】:2011-04-16 08:01:23 【问题描述】:

为什么会出现以下构建错误?

C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe C:\Code\EduBenesysNET\EduBenesysNET\EduBenesysNET.vbproj /t:publish /p:Configuration=Release /p:Platform=AnyCPU / v:detailed /p:PublishDir="\\BSIIS3\c$\DATA\WEBSITES\benesys.net\benesys.net\TotalEducationTest\" /p:InstallUrl="https://www.benesys.net/benesys.net /TotalEducationTest/" /p:ApplicationVersion=1.0.1.198 /p:ProductName="Total Education TEST" /p:PublisherName="BeneSys, Inc." /p:UpdateRequired="True" /p:MinimumRequiredVersion=1.0.1.198
Microsoft (R) Build Engine 版本 3.5.30729.1
[Microsoft .NET 框架,版本 2.0.50727.3603]
版权所有 (C) Microsoft Corporation 2007。保留所有权利。

。
开关:教育

对于切换语法,键入“MSBuild /help”

我没有看到如何指定第二个项目。 它是否存储在某个项目文件中?

【问题讨论】:

同样的命令在 powershell 中有效,但在 cmd.exe 中无效...看起来您在某处遇到了空间字符序列... 【参考方案1】:

事实证明 PublishDir 属性中的尾部斜杠正在转义结束引号。转义斜杠解决了我的问题。

/p:PublishDir="\\BSIIS3\c$\DATA\WEBSITES\benesys.net\benesys.net\TotalEducationTest\\"

这样,我们可以在 MSBuild 需要尾部斜杠的属性中为具有空格的路径使用引号。

我知道这是一篇旧帖子,但我觉得我需要与某人分享:-)

【讨论】:

【参考方案2】:

解决方案 删除 /p:PublishDir 设置周围的引号

即 而不是引号

/p:PublishDir="\\BSIIS3\c$\DATA\WEBSITES\benesys.net\benesys.net\TotalEducationTest\"  

不使用引号

/p:PublishDir=\\BSIIS3\c$\DATA\WEBSITES\benesys.net\benesys.net\TotalEducationTest\  

很抱歉我没有早点发布我的发现。实际上,我不得不再次研究以查看需要更改的内容。谁会想到删除引号会起作用?我在查看同事为另一个解决方案构建时发现了这一点,并注意到它没有引号。

【讨论】:

这很奇怪。就我而言,我遇到了同样的错误,但问题是我有一个未引用的路径,其中有一个空格。添加引号解决了问题。 我遇到了与@MarkArnott 相同的问题,它不适用于空格或转义空格,但引用可以。 可能你路径中的最后一个反斜杠正在转义结束的双引号。如果正确,则不需要删除双引号,而是需要转义反斜杠。 请记住,目录路径中的空格需要转义或必须放在双引号内【参考方案3】:

在 Git Bash 上,我必须使用双斜杠指定参数,例如:

MSBuild.exe "Path\to\Solution.sln" //p:Platform="x86" //p:Configuration=Release //p:AppxBundlePlatforms="x86" 

【讨论】:

看起来这是根本原因,与 Git_Bash 如何在 POSIX 路径上工作有关,以斜线开头,混合 windows 样式路径 双斜线解决,或者您可以禁用自动路径转换以保留互操作性历史:mingw.org/wiki/Posix_path_conversion 发行说明github.com/git-for-windows/build-extra/blob/…【参考方案4】:

当您的路径或属性包含空格且未引用时,就会出现此问题。

你所有的属性和路径都有引号,这很奇怪。报错提示Education为开关,尝试删除/p:ProductName="Total Education TEST"看看是否有效。

【讨论】:

避免文件夹路径中的空格以解决此问题。 @Julien Hoarau:我试过MSBuild.exe C:\BuildAgent\work\4c7b8ac8bc7d723e\WebService.sln /p:Configuration=Release /p:OutputPath=bin /p:DeployOnBuild=True /p:DeployTarget=MSDeployPublish /p:MsDeployServiceUrl=https://204.158.674.5/msdeploy.axd /p:username=Admin /p:password=Password#321 /p:AllowUntrustedCertificate=True /p:DeployIisAppPath=Default WebSite/New /p:MSDeployPublishMethod=WMSVC。它给了我一个错误MSBUILD : error MSB1008: Only one project can be specified. Switch: WebSite/New。可能是什么问题? @NevinRajVictor 晚了很多,但也许你应该在Default WebSite/New周围加上引号【参考方案5】:

您需要在路径和文件名周围加上 qoutes。 所以使用 MSBuild "C:\Path Name\File Name.Exe" /[选项]

【讨论】:

【参考方案6】:

尝试删除发布路径末尾的反斜杠或斜杠并安装 url

/p:PublishDir="\\BSIIS3\c$\DATA\WEBSITES\benesys.net\benesys.net\TotalEducationTest"
/p:InstallUrl="https://www.benesys.net/benesys.net/TotalEducationTest"

你一定是用 \" 和(或)/" 击中了一个特殊的字符序列,但我在 cmd.exe 中知道的不够多,无法弄清楚。

我个人一直使用 Powershell:它更友好、更强大!

希望对你有帮助!

【讨论】:

【参考方案7】:

在 vs2012 中,只需尝试使用默认 TFS 模板“DefaultTemplate....xaml”(通常是它的副本)创建构建定义“测试构建”

它将失败并出现通常的自我解释错误:“MSBUILD : error MSB1008: Only one project can be specified.Switch: Activities”

默认 TFS 模板中的某处缺少一些 ",因此 msbuild 将接收一个包含空格的非转义目录作为参数,因此将导致多个项目(?!)

所以永远不要在你的 TFS 构建定义名称中使用空格,同时非常悲伤和简单

【讨论】:

这个答案可能需要整理一下。很难跟上。 永远不要在你的 TFS 构建定义名称中使用空格是一个很好的观点!这让我多次抓到。【参考方案8】:

当我收到错误时,我在密码参数周围使用了单引号

/p:password='my secret'不好

并将其更改为使用双引号来解决问题。

/p:password="my secret"

这可能同样适用于任何需要为包含空格的值加上引号的参数。

【讨论】:

【参考方案9】:

对我来说,我忘了加上结束语

/p:DeployOnBuild=true;OutDir="$(build.artifactstagingdirectory)

/p:DeployOnBuild=true;OutDir="$(build.artifactstagingdirectory)"

【讨论】:

我还缺少右双引号。【参考方案10】:

还有另一个原因和解决方案:检查您是否没有在错误的位置放置空格,即在参数中;我的是dotnet -c Release - o /home/some/path(注意-o之间的空格),我一直在看路径本身,这是正确的,让我失望了。希望有帮助! (这是在 Bash 中,但它也应该适用于 Windows)

【讨论】:

【参考方案11】:

这在 TFS MSBuild Argument 中对我有用。注意斜线的数量。

/p:DefaultPackageOutputDir="\\Rdevnet\Visual Studio Projects\Insurance\"

【讨论】:

【参考方案12】:

如果您在 Jenkins 中使用默认工作区,则可能会发生这种情况。 使用没有任何空格的自定义工作区位置。

【讨论】:

【参考方案13】:

为未来的读者。

我收到此错误是因为我指定的 LOG 文件中有空格:

之前:

/l:FileLogger,Microsoft.Build.Engine;logfile=c:\Folder With Spaces\My_Log.log

之后:(解决了它)

/l:FileLogger,Microsoft.Build.Engine;logfile="c:\Folder With Spaces\My_Log.log"

【讨论】:

【参考方案14】:

如果您使用 Azure DevOps MSBuild 任务,错误可能是由双重配置标志引起的。请确保将 $(BuildConfiguration) 放在指定框中,而不是 MSBuild Arguments 之一:

【讨论】:

【参考方案15】:

如果您使用的是Any CPU,您可能需要将其放在单引号中。

当然,在 Dockerfile 中运行时,我必须使用单引号:

# Fails. Gives: MSBUILD : error MSB1008: Only one project can be specified.
RUN msbuild ConsoleAppFw451.sln /p:Configuration=Debug /p:Platform="Any CPU" 

# Passes. Gives: Successfully built 40163c3e0121
RUN msbuild ConsoleAppFw451.sln /p:Configuration=Debug /p:Platform='Any CPU' 

【讨论】:

【参考方案16】:

对我来说,在双引号中添加解决方案文件的路径解决了这个问题。路径中的一个文件夹的名称中有一个空格,这导致它考虑 2 个解决方案文件而不是一个。 我在下面执行的是并且它有效。

MSBuild.exe "C:\Folder Name With Space\Project\project.sln"

【讨论】:

【参考方案17】:

以防万一有人和我有同样的问题,我在“/p”参数之一之前缺少“/”。从描述上看不是很清楚。我希望这对某人有所帮助。

【讨论】:

【参考方案18】:

我确实使用了https://www.codingdefined.com/2014/10/solved-msbuild-error-msb1008-only-one.html 中给出的解决方案,这解决了这个问题。我们需要做的就是检查命令中的空格和''(检查反斜杠)

【讨论】:

【参考方案19】:

我用一个非常简单的命令遇到了这个问题,它不包含任何引号、任何空格、任何斜线,任何奇怪的东西。

我使用的是 MINGW64 shell。

PowerShell 中的完全相同的命令反而起作用了。

【讨论】:

【参考方案20】:

就我而言,是开关。我通过使用 -p 而不是 /p 解决了它。

【讨论】:

以上是关于MSBUILD : 错误 MSB1008: 只能指定一个项目的主要内容,如果未能解决你的问题,请参考以下文章

Rider Xamarin 错误 MSB1008:只能指定一个项目

错误 MSB4019 - MSBUILD 正在寻找不存在版本的导入

MSBuild 无法使用临时密钥签署 ClickOnce 清单(错误 MSB3326 和 MSB3321)

MSBUILD:错误MSB1009:项目文件不存在

这个字符串中的非法字符是啥?我收到 MSBUILD :错误 MSB3095

msbuild 错误 MSB3191:在远程服务器中发布时无法创建目录