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

154
我为什么会收到以下构建错误消息?
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 Version 3.5.30729.1
[Microsoft .NET Framework, Version 2.0.50727.3603]
Copyright (C) Microsoft Corporation 2007. All rights reserved.
MSBUILD : error MSB1008: Only one project can be specified. Switch: Education
For switch syntax, type "MSBuild /help"
我没有看到第二个项目被指定在哪里,它存储在某个项目文件中吗?

5
同样的命令在PowerShell中有效,但在cmd.exe中无效...看起来你遇到了某个特殊字符序列的问题... - Cédric Rup
24个回答

152

结果发现在PublishDir属性中的尾部斜杠转义了结束引号。转义掉这个尾部斜杠解决了我的问题。

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

这种方式可以在路径中有空格的属性上使用引号,这是MSBuild要求有尾部斜线的。

我知道这是一篇旧文章,但我觉得我需要和某人分享一下 :-)


57

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

On Git Bash我需要像这样使用双反斜杠指定参数:

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

1
看起来这是根本原因,与Git_Bash如何在以斜杠开头的POSIX路径上工作有关,将Windows样式路径混合在一起。双斜杠可以解决问题,或者您可以禁用自动路径转换以保持互操作性。历史记录:http://www.mingw.org/wiki/Posix_path_conversion发布说明 https://github.com/git-for-windows/build-extra/blob/a9090580ee37686a53166796dffda531041e16f8/ReleaseNotes.md - Wolfium
4
你可以使用“-p”代替“/p”。 - parched
-p 对我也有效。 - Mehdi Hadeli

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

例如:
不要使用引号。

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

不使用引号

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

很抱歉我没有更早地发布我的发现。实际上,我不得不重新进行研究,以查看需要更改的内容。谁会想到去掉引号就可以解决问题呢?当我查看同事为另一个解决方案构建的版本时,注意到它没有引号时,我发现了这一点。


2
这很奇怪。在我的情况下,我得到了同样的错误,但问题是我有一个未加引号的路径,其中包含一个空格。添加引号解决了问题。 - Mark Arnott
我遇到了与@MarkArnott相同的问题,它不能处理空格或转义空格,但使用引号可以解决。 - Zitrax
9
你的路径中最后一个反斜杠可能是用来转义闭合双引号的。如果正确,那么你不需要移除双引号,而是需要转义反斜杠。 - Carl G
2
请记住,目录路径中的空格需要转义或放置在双引号内。 - OK999

33

当路径或属性包含空格且未被引用时,就会出现这个问题。

所有的属性和路径都要用引号括起来,这很奇怪。错误消息将 Education 识别为一个开关,请尝试删除 /p:ProductName="Total Education TEST" 然后看看是否可以正常工作。


4
避免在文件夹路径中使用空格以消除此问题。 - Gopinath
1
@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。可能出了什么问题? - Nevin Raj Victor
@NevinRajVictor 很晚了,但你可能应该在 Default WebSite/New 周围加上引号。 - Anderson Pimentel

11

您需要在路径和文件名周围加引号。
因此,请使用 MSBuild "C:\Path Name\File Name.Exe" /[选项]


4
尝试删除您发布路径和安装 URL 末尾的反斜杠或斜杠。
/p:PublishDir="\\BSIIS3\c$\DATA\WEBSITES\benesys.net\benesys.net\TotalEducationTest"
/p:InstallUrl="https://www.benesys.net/benesys.net/TotalEducationTest"

你可能在输入\"和(或)/时触发了特殊字符序列,但我在cmd.exe方面的知识不足以解决问题。

个人建议使用Powershell:它更加友好且功能更强大!

希望这能对你有所帮助!


4

另一个引起此问题的原因和解决方案是:检查您是否误把空格放在了错误的位置,例如在参数中;比如我的命令是 dotnet -c Release -o /home/some/path(注意 -o 之间没有空格),我一直看着路径本身,而路径是正确的,结果误导了我。希望这能帮到您!(虽然此例是在Bash下,但也适用于Windows)


4

当我在密码参数周围使用单引号时,出现了错误。

/p:password='my secret' 错误

为了解决问题,我改用双引号。

/p:password="my secret" 正确

可能对于任何需要引号的参数,如果值中包含空格,则同样适用。


3
如果你正在使用 Azure DevOps 的 MSBuild 任务,错误可能是由于重复的配置标志引起的。请确保将 $(BuildConfiguration) 放入指定框中,而不是放在 MSBuild 参数框中:enter image description here

3
在VS2012中,尝试使用默认TFS模板“DefaultTemplate....xaml”(通常是其副本)创建一个构建定义“Test Build”。但是会出现通常的自我解释错误:“MSBUILD:error MSB1008:只能指定一个项目。开关:Activities”。
当然,在默认TFS模板的某些位置上缺少了一些引号,因此msbuild将接收一个未转义的包含空格的目录作为参数,从而导致多个项目(?!)。所以永远不要在TFS构建定义名称中使用空格,这既令人难过又简单。

1
这个答案需要整理一下。非常难以理解。 - theMayer
1
永远不要在TFS构建定义名称中使用空格,这是一个很好的提示!我曾经犯过多次这个错误。 - Valentein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接