MSBUILD: ошибка MSB1008: можно указать только один проект

116

Почему я получаю следующую ошибку сборки?

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ msbuild.exe C: \ Code \ EduBenesysNET \ EduBenesysNET \ EduBenesysNET.vbproj / t: publish / p: Configuration = Release / p: Platform = AnyCPU / v: подробно / 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 Framework, версия 2.0.50727.3603]
Авторские права (C) Microsoft Corporation 2007. Все права защищены.

MSBUILD: ошибка MSB1008: можно указать только один проект.
Switch: Образование

Для синтаксиса переключателя введите «MSBuild / help».

Я не вижу, как уточняется второй проект.
Он хранится где-нибудь в файле проекта?

Герхард Вайс
источник
4
Та же самая команда работает в PowerShell, но не в cmd.exe ... похоже, что вы где-то попадаете в пространственную последовательность символов ...
Седрик Руп

Ответы:

135

Оказывается, завершающая косая черта в свойстве PublishDir экранирует конечную кавычку. Избегая косой черты, я решил проблему.

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

Таким образом, мы можем использовать кавычки для путей с пробелами в свойствах, которые MSBuild требует завершающей косой черты.

Я знаю, что это старый пост, но мне кажется, что мне нужно поделиться им с кем-нибудь :-)

Мэтт
источник
45

РЕШЕНИЕ
Удалите кавычки вокруг параметра / 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
Это очень странно. В моем случае я получил ту же ошибку, но проблема в том, что у меня был путь без кавычек с пробелом. Добавление цитат устранило проблему.
Марк Арнотт
У меня была та же проблема, что и у @MarkArnott, он не работал с пробелами или экранированными пробелами, но цитирование работало.
Zitrax 05
7
Скорее всего, последняя обратная косая черта на вашем пути избегала закрывающих двойных кавычек. Если все правильно, то вам не нужно удалять двойные кавычки, вместо этого вам нужно избегать обратных косых черт.
Carl G
2
Помните, что пробелы в пути к каталогу должны быть экранированы или должны быть заключены в двойные кавычки
OK999,
31

В Git Bash мне пришлось указать параметры двойными косыми чертами, например:

MSBuild.exe "Path\to\Solution.sln" //p:Platform="x86" //p:Configuration=Release //p:AppxBundlePlatforms="x86" 
пятница
источник
27

Эта проблема возникает, когда у вас есть путь или свойство, содержащее пробел и не заключенное в кавычки.

Все ваши свойства и путь имеют кавычки, это странно. Сообщение об ошибке обозначается Educationкак переключатель, попробуйте удалить, /p:ProductName="Total Education TEST"чтобы проверить, работает ли он.

Жюльен Хорау
источник
4
Избегайте пробелов в пути к папке, чтобы избавиться от этой проблемы.
Гопинатх
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. В чем может быть проблема?
Невин Радж Виктор
@NevinRajVictor Сильно поздно, но, вероятно, вам стоит поставить кавычкиDefault WebSite/New
Андерсон Пиментел
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: он намного удобнее и мощнее!

Надеюсь, поможет!

Седрик Руп
источник
3

В vs2012 просто попробуйте создать определение сборки «Test Build», используя шаблон TFS по умолчанию «DefaultTemplate .... xaml» (обычно его копию)

Произойдет сбой с обычной самоочевидной ошибкой: «MSBUILD: ошибка MSB1008: можно указать только один проект. Переключатель: Действия»

Конечно, где-то в шаблоне TFS по умолчанию какой-то " них отсутствуют, поэтому msbuild получит в качестве параметра неэкранированный каталог, содержащий пробелы, что приведет к созданию нескольких проектов (?!)

Так что НИКОГДА не используйте пробелы в именах TFS Build Definition, довольно грустных и простых одновременно.

user3636264
источник
1
Этот ответ можно было бы привести в порядок. Очень сложно уследить.
theMayer
1
Мысль о том, чтобы никогда не использовать пробелы в именах определений сборки TFS, - это хорошо! Меня это ловило несколько раз.
Валентейн 05
3

Я заключил параметр пароля в одинарные кавычки, когда получил сообщение об ошибке

/p:password='my secret' плохой

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

/p:password="my secret" хорошо

Вероятно, то же самое применимо к любому параметру, которому нужны кавычки для значений, содержащих пробел.

Джон К.
источник
3

Для меня я забыл добавить заключительную цитату

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

к

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

Реза
источник
Мне также не хватало закрывающих двойных кавычек.
Хабиб
2

Для будущих читателей.

Я получил эту ошибку, потому что в моем указанном файле журнала было пробел:

ПЕРЕД:

/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"
granadaCoder
источник
2

Еще одна причина и решение: проверьте, не поставили ли вы пробел не в том месте, то есть в параметрах; мой был dotnet -c Release - o /home/some/path(обратите внимание на пробел между -и o), я продолжал смотреть на сам путь, который был правильным и сбил меня с толку. Надеюсь, это поможет! (это было в Bash, хотя это также должно относиться к Windows)

Кристиан Рондо
источник
1

Это сработало для меня в аргументе TFS MSBuild. Обратите внимание на количество косых черт.

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

Марк Монфорти
источник
1

Если вы используете рабочее пространство по умолчанию в Jenkins, это может произойти. Используйте настраиваемое расположение рабочей области без пробелов.

введите описание изображения здесь

user8537391
источник
1

Если вы используете MSBuildзадачу Azure DevOps, ошибка может быть вызвана двойным флагом конфигурации. Убедитесь, что вы $(BuildConfiguration)указали указанное поле вместо первого аргумента MSBuild: введите описание изображения здесь

Я. Винцевич
источник
1

Если вы используете 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' 
Badgerspot
источник
0

На всякий случай, если у кого-то такая же проблема, как у меня, я пропустил «/» перед одним из аргументов «/ p». Не очень понятно из описания. Я надеюсь, что это поможет кому-то.

Джонни
источник