MSBUILD: błąd MSB1008: można określić tylko jeden projekt

116

Dlaczego otrzymuję następujący błąd kompilacji?

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ msbuild.exe C: \ Code \ EduBenesysNET \ EduBenesysNET \ EduBenesysNET.vbproj / t: opublikuj / p: Configuration = Release / p: Platform = AnyCPU / v: szczegółowe / 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
Silnik kompilacji Microsoft (R) w wersji 3.5.30729.1
[Microsoft .NET Framework, wersja 2.0.50727.3603]
Copyright (C) Microsoft Corporation 2007. Wszelkie prawa zastrzeżone.

MSBUILD: błąd MSB1008: można określić tylko jeden projekt.
Switch: Edukacja

Aby uzyskać składnię przełącznika, wpisz „MSBuild / help”

Nie wiem, jak określono drugi projekt.
Czy jest gdzieś przechowywany w pliku projektu?

Gerhard Weiss
źródło
4
Ta sama komenda działa w PowerShell, ale nie w cmd.exe ... wygląda na to uderzenie przestrzenną postać sequance gdzieś ...
Cedric RUP

Odpowiedzi:

135

Okazuje się, że końcowy ukośnik we właściwości PublishDir ucieka przed końcowym cudzysłowem. Uniknięcie końcowego ukośnika rozwiązało mój problem.

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

W ten sposób możemy używać cudzysłowów dla ścieżek, które mają białe znaki we właściwościach, które MSBuild wymaga końcowego ukośnika.

Wiem, że to stary post, ale czuję, że muszę się tym z kimś podzielić :-)

Matt
źródło
45

ROZWIĄZANIE
Usuń cudzysłowy wokół ustawienia / p: PublishDir

tzn.
zamiast cytatów

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

Nie używaj cudzysłowów

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

Przepraszam, że nie wysłałem wcześniej mojego znaleziska. Właściwie musiałem ponownie zbadać, co należy zmienić. Kto by pomyślał, że usuwanie cytatów zadziała? Odkryłem to podczas przeglądania kompilacji współpracowników dla innego rozwiązania i zauważyłem, że nie ma ona cudzysłowów.

Gerhard Weiss
źródło
2
To jest bardzo dziwne. W moim przypadku pojawił się ten sam błąd, ale problem polega na tym, że miałem niecytowaną ścieżkę ze spacją. Dodanie cytatów rozwiązało problem.
Mark Arnott,
Miałem ten sam problem, co @MarkArnott, nie działał ze spacjami ani ze znakami ucieczki, ale cytowanie tak.
Zitrax,
7
Prawdopodobnie ostatni lewy ukośnik na twojej ścieżce uciekał przed zamykającym cudzysłowem. Jeśli tak, to nie trzeba było usuwać cudzysłowów, ale zamiast tego trzeba było uciec przed ukośnikami odwrotnymi.
Carl G
2
Pamiętaj, że spacje w ścieżce dir muszą zostać
zmienione
31

W Git Bash musiałem określić parametry za pomocą podwójnych ukośników, takich jak:

MSBuild.exe "Path\to\Solution.sln" //p:Platform="x86" //p:Configuration=Release //p:AppxBundlePlatforms="x86" 
piątek
źródło
27

Ten problem pojawia się, gdy istnieje ścieżka lub właściwość zawierająca spację, która nie jest cytowana.

Wszystkie twoje nieruchomości i ścieżki są otoczone cytatem, to dziwne. Komunikat o błędzie wskazuje Educationjako przełącznik, spróbuj usunąć, /p:ProductName="Total Education TEST"aby sprawdzić, czy działa.

Julien Hoarau
źródło
4
Unikaj miejsca w ścieżce folderu, aby pozbyć się tego problemu.
Gopinath,
1
@Julien Hoarau: Próbowałem 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. Daje mi błąd MSBUILD : error MSB1008: Only one project can be specified. Switch: WebSite/New. Jaki może być problem?
Nevin Raj Victor
@NevinRajVictor Dużo późno, ale prawdopodobnie powinieneś cytowaćDefault WebSite/New
Anderson Pimentel
11

Musisz umieścić qoutes wokół ścieżki i nazwy pliku.
Dlatego użyj programu MSBuild „C: \ Nazwa ścieżki \ Nazwa pliku.Exe” / [Opcje]

Zamir
źródło
4

Spróbuj usunąć końcowy ukośnik odwrotny lub ukośnik na końcu ścieżki publikacji i adresu URL instalacji

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

Musisz trafić w specjalną sekwencję znaków za pomocą \ "i (lub) /", ale nie wiem wystarczająco dużo w cmd.exe, aby to rozgryźć.

Osobiście zawsze używam Powershell: jest o wiele bardziej przyjazny i potężny!

Mam nadzieję, że to pomoże!

Cédric Rup
źródło
3

W vs2012 po prostu spróbuj utworzyć definicję kompilacji „Kompilacja testowa” przy użyciu domyślnego szablonu TFS „DefaultTemplate .... xaml” (zwykle jest to jego kopia)

Zakończy się niepowodzeniem z typowym błędem wymagającym wyjaśnienia: „MSBUILD: błąd MSB1008: można określić tylko jeden projekt. Przełącznik: Działania”

Oczywiście gdzieś w domyślnym szablonie TFS "brakuje niektórych, więc msbuild otrzyma jako parametr katalog bez zmiany znaczenia, zawierający spacje, więc spowoduje to wiele projektów (?!)

Dlatego NIGDY nie używaj spacji w nazwach definicji budowania TFS, dość smutnych i jednocześnie prostych

user3636264
źródło
1
Ta odpowiedź może wymagać uporządkowania. Bardzo trudne do naśladowania.
theMayer
1
Kwestia dotycząca nigdy nie używania odstępów w nazwach definicji budowania TFS jest dobra! To mnie złapało wiele razy.
Valentein
3

Kiedy pojawił się błąd, użyłem apostrofów wokół parametru hasła

/p:password='my secret' zły

i zmieniłem go tak, aby używał podwójnych cudzysłowów w celu rozwiązania problemu.

/p:password="my secret" dobry

Prawdopodobnie to samo dotyczy każdego parametru, który wymaga cudzysłowów dla wartości zawierających spację.

John K.
źródło
3

Dla mnie zapomniałem dodać cytat zamykający

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

do

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

Reza
źródło
Brakowało mi też zamykających podwójnych cudzysłowów.
habib
2

Dla przyszłych czytelników.

Otrzymałem ten błąd, ponieważ mój określony plik LOG miał w nim spację:

PRZED:

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

PO: (co go rozwiązało)

/l:FileLogger,Microsoft.Build.Engine;logfile="c:\Folder With Spaces\My_Log.log"
granadaCoder
źródło
2

Jeszcze jedna przyczyna i rozwiązanie tego problemu: Sprawdź, czy nie umieściłeś spacji w niewłaściwym miejscu, tj. W parametrach; moja była dotnet -c Release - o /home/some/path(zwróć uwagę na odstęp między -i o), patrzyłem na samą ścieżkę, która była poprawna i wyrzuciła mnie. Mam nadzieję, że to pomoże! (to było w Bash, chociaż powinno również dotyczyć Windows)

Christian Rondeau
źródło
1

To zadziałało dla mnie w argumencie TFS MSBuild. Zwróć uwagę na liczbę ukośników.

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

Mark Monforti
źródło
1

Może to wystąpić, jeśli używasz domyślnego obszaru roboczego w Jenkins. Użyj niestandardowej lokalizacji obszaru roboczego bez spacji.

wprowadź opis obrazu tutaj

user8537391
źródło
1

Jeśli używasz MSBuildzadania Azure DevOps, błąd może być spowodowany podwójną flagą konfiguracji. Upewnij się, że umieściłeś $(BuildConfiguration)w określonym polu zamiast argumentów MSBuild jeden: wprowadź opis obrazu tutaj

J.Wincewicz
źródło
1

Jeśli używasz Any CPU, może być konieczne umieszczenie go w pojedynczych cudzysłowach.

Z pewnością podczas uruchamiania w pliku Dockerfile musiałem używać pojedynczych cudzysłowów:

# 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
źródło
0

Na wypadek, gdyby ktoś miał ten sam problem co ja, brakowało mi znaku „/” przed jednym z argumentów „/ p”. Nie bardzo jasne z opisu. Mam nadzieję, że to komuś pomoże.

Jasio
źródło