ระบุไฟล์โครงการของโซลูชันโดยใช้ msbuild


116

ฉันต้องการบรรทัดคำสั่งสำหรับสร้างโครงการเฉพาะของโซลูชันโดยใช้ msbuild เหมือนกับที่เราทำกับ devenv.com ใน devenv.com เราสามารถระบุโครงการของโซลูชันโดยใช้บรรทัดคำสั่งต่อไปนี้

devenv.com /Build Release|x86 test.sln /project "testproject"

การใช้บรรทัดคำสั่งข้างต้นฉันสามารถสร้างโครงการทดสอบใน test.sln โดยใช้ devenv.com บรรทัดคำสั่งสำหรับ msbuild สำหรับโซลูชันเดียวกันคืออะไร

ขอบคุณ


มีเหตุผลอะไรที่คุณไม่เพียงแค่ส่ง testproject ไปยัง msbuild?
Mark Smith

2
เนื่องจากฉันไม่สามารถแก้ไขความคิดเห็นของฉันได้อีกต่อไป สิ่งที่ฉันหมายถึงคืออ้างอิงโครงการโดยตรงแทนที่จะเป็นโซลูชัน "msbuild testproject / p: Configuration = Release / p: Platform = x86"
Mark Smith

เวลาอื่นฉันต้องสร้างโครงการที่แตกต่างกันการใช้ devenv.com มันง่ายมากโดยระบุโครงการของโซลูชันนั้น
tjdoubts

หากนั่นเป็นปัญหาเดียวที่คุณมีคุณควรจะสามารถใช้ msbuild เพื่อสร้างโครงการที่จำเป็นในเวลาที่ถูกต้อง คุณมีคำสั่งที่แตกต่างกันที่ใช้ในเวลาที่ต่างกันในโซลูชันดังนั้นทำไมไม่เพียงอ้างอิงโครงการในเวลาที่เหมาะสมด้วยคำสั่ง msbuild ที่แตกต่างกัน หากโครงการของคุณได้รับการตั้งค่าอย่างถูกต้องควรหาข้อมูลอ้างอิงทั้งหมดโดยไม่ต้องใช้ไฟล์ sln
Mark Smith

คำตอบ:


202
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

สังเกตว่าสิ่งที่กำหนดให้/tเป็นชื่อโปรเจ็กต์ในโซลูชันอาจแตกต่างจากชื่อไฟล์โปรเจ็กต์

ตามที่ระบุไว้ในHow to: สร้างเป้าหมายเฉพาะในโซลูชันโดยใช้ MSBuild.exe :

ถ้าชื่อโครงการที่ประกอบด้วยใด ๆ ของตัวละคร%, $, @, ;, ., (, )หรือ'แทนที่พวกเขาด้วย_ในชื่อของเป้าหมายที่กำหนดไว้

คุณยังสามารถสร้างหลายโครงการพร้อมกัน:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

ในการสร้างใหม่หรือทำความสะอาดให้เปลี่ยน/t:projectเป็น/t:project:cleanหรือ/t:project:rebuild


99
หมายเหตุสำคัญประการหนึ่ง: หากโครงการของคุณมี "." ในชื่อคุณจะต้องแทนที่ด้วย '_' เมื่อระบุด้วย / t
Watusimoto

4
@easton สำหรับการสร้างหลายโปรเจ็กต์ synthax สำหรับ msbuild ของฉันเพื่อทำซ้ำ/tพารามิเตอร์สำหรับแต่ละโปรเจ็กต์ที่จะสร้าง:msbuild test.sln /t:project /t:project2
Philippe

46
นอกจากนี้หากคุณใช้โฟลเดอร์โซลูชันคุณต้องนำหน้าชื่อโปรเจ็กต์ด้วยชื่อโฟลเดอร์และเครื่องหมายทับ เช่นเดียวกับ @Watusimoto ที่กล่าวถึงข้างต้นหากคุณมีจุด (.) ในชื่อคุณต้องแทนที่ด้วยเครื่องหมายขีดล่าง (_) ฉันลงเอยด้วยสิ่งนี้: /t:SlnFolder\My_Project_name.
Travis Parks

28
@TravisParks: นอกจากนี้ยังควรกล่าวถึงว่า "โฟลเดอร์โซลูชัน" ไม่ได้อ้างถึงโฟลเดอร์ระบบไฟล์ แต่เป็นโฟลเดอร์ในมุมมองโซลูชัน Explorer
joshbodily

4
ฉันต้องแทนที่ '(' และ ')' ด้วย '_' ในชื่อโฟลเดอร์ด้วย (โครงการที่สร้างโดย GYP) ฉันเดาว่าอักขระพิเศษทั้งหมดจะถูกแทนที่ด้วยขีดล่าง
Maxime Viargues

15

MSBuild ใช้งานได้จริงผ่านการใช้โครงการไม่ใช่วิธีแก้ปัญหา โซลูชันนี้ใช้เพื่อแยกวิเคราะห์ลงในไฟล์โครงการชั่วคราวใน MSBuild ภายในเท่านั้น คุณควรจะสามารถสร้างโครงการที่สนใจได้โดยตรงผ่าน MSBuild โดยดำเนินการคำสั่งต่อไปนี้

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

มีปัญหาสำคัญอย่างหนึ่งที่ฉันรู้ว่าคุณสามารถใช้โครงการได้โดยตรงแทนที่จะเป็นวิธีแก้ปัญหา: ถ้าคุณใช้โซลูชันเพื่อแสดงการอ้างอิงระหว่างโครงการแทนที่จะเพิ่มการอ้างอิงไปยังโครงการและปล่อยให้ระบบบิลด์ทำการอ้างอิงโดยอัตโนมัติ .

หากคุณบังคับใช้คำสั่งบิลด์โดยใช้ไฟล์ sln ฉันขอแนะนำให้ใช้การอ้างอิงเหล่านั้นโดยตรงในไฟล์ proj และลบออกจาก sln วิธีนี้จะช่วยให้คุณสามารถเรียกใช้ไฟล์ proj จาก MSBuild ได้โดยตรงและโปรเจ็กต์ทั้งหมดจะสร้างขึ้นโดยอิสระโดยไม่ต้องทำงานเพิ่มเติม คุณควรถือว่าไฟล์ sln เป็นกลุ่มของโปรเจ็กต์เพื่อให้การทำงานใน Visual Studio ง่ายขึ้นไม่ใช่เป็นการสร้างอินพุต


4
โปรดชี้ไปที่วิธีการบังคับใช้คำสั่งสร้างจากไฟล์ proj ขอบคุณ.
ProgramCpp

4
นี่คือปัญหาอื่นในการใช้ชื่อโครงการโดยตรง ตัวอย่างเช่นคุณมี 5 โครงการในโซลูชันของคุณ บางโครงการมีการกำหนดค่า DebugPro และโครงการอื่น ๆ ไม่มี หากคุณสร้างโปรเจ็กต์ด้วยคอนฟิกูเรชันที่โปรเจ็กต์ทั้งหมดมีทุกอย่างเป็นไฟล์ แต่มีเพียงไฟล์โซลูชันเท่านั้นที่รู้ว่าจะใช้คอนฟิกูเรชันโปรเจ็กต์ใดสำหรับแต่ละโปรเจ็กต์หากคุณเลือกคอนฟิกูเรชันโซลูชัน DebugPro
Alex

@ProgramCpp เมื่อคุณเพิ่มการอ้างอิงจากโปรเจ็กต์หนึ่งไปยังอีกโปรเจ็กต์หนึ่งระบบจะระบุโดยอัตโนมัติว่าโปรเจ็กต์ที่อ้างอิงนั้นจำเป็นต้องสร้างก่อน
jpaugh

ข้อเสียอีกประการหนึ่งของแนวทางนี้คือเส้นทางสัมพัทธ์ในโครงการได้รับการแก้ไขโดยสัมพันธ์กับไฟล์โซลูชัน เมื่อคุณสร้างโครงการเส้นทางสัมพัทธ์โดยตรงจะเปลี่ยนไป ผลลัพธ์อาจอยู่ที่อื่นและการทดสอบหน่วยอาจค้นหาไดเรกทอรีที่ไม่ถูกต้อง
Tomas Kubes

ปัญหาอาจปรากฏขึ้นหากคุณใช้ตัวแปรโซลูชันในการกำหนดค่าโครงการเช่น $ (SolutionDir)
Alex Che

8

โพสต์เพื่อเป็นข้อมูลแก่ผู้แสวงหาในอนาคต

เพิ่มสิ่งต่อไปนี้ลงในบิลด์สคริปต์และเรียกใช้ครั้งเดียว สิ่งนี้จะสร้างเป้าหมายที่แน่นอนและข้อมูลอื่น ๆ ที่ msbuild จะใช้จริง

เช่นหากคุณมี.ในชื่อโปรเจ็กต์หรือโฟลเดอร์ msbuild คาดว่าจะ_แทนที่ไฟล์..

set MSBuildEmitSolution=1

หลังจากได้รับข้อมูลแล้วให้อัปเดตสคริปต์บิลด์พร้อมรายละเอียดที่จำเป็น


6
`ถ้าคุณมี '.' ในชื่อโปรเจ็กต์หรือโฟลเดอร์ msbuild จะคาดหวัง '_' แทน '.'. `
dhcgn

2

ในการดำเนินการนี้คุณจำเป็นต้องทราบว่าชื่อเป้าหมายของโครงการคืออะไรไม่จำเป็นต้องเป็นชื่อโครงการ

วิธีหนึ่งในการค้นหาสิ่งนี้คือการใช้ MSBuild กับ SLN ของคุณด้วยพารามิเตอร์ที่ต้องการหลังจากตั้งค่าตัวแปรสภาพแวดล้อมพิเศษที่เรียกว่าMSBuildEmitSolutionค่าของ1.

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

เมื่อเร็ว ๆ นี้ฉันต้องทำสิ่งนี้เนื่องจากชื่อที่เฉพาะเจาะจงมากสำหรับเป้าหมายในไดเรกทอรีที่ซ้อนกัน ดังนั้นจากไฟล์ที่สร้างขึ้นmy_stuff.sln.metaprojฉันพบบรรทัดนี้:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

นั่นหมายความว่าบรรทัดคำสั่งที่จะใช้กลายเป็น

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64

2
นี่คือสิ่งที่ฉันต้องการ คำแนะนำหากคุณไม่ต้องการเรียกใช้สิ่งนี้เป้าหมายของคุณคือโครงสร้างโฟลเดอร์จากเส้นทางปัจจุบันไปยังไฟล์โครงการของคุณลบนามสกุลไฟล์โครงการ ( .csprojในกรณีของฉัน) ฉัน <3 ดังนั้น!
ไม่คืนเงินไม่รับคืน

1

เพียงเพื่อเพิ่มข้อมูลเพิ่มเติมการรัน msbuild ในโฟลเดอร์โปรเจ็กต์จะสร้างไฟล์โปรเจ็กต์ตามค่าเริ่มต้นเนื่องจากเป็นไฟล์เดียวที่นั่น

>msbuild

การใช้ msbuild ด้วยวิธีนี้มีหลายรูปแบบ คุณสามารถระบุไฟล์ proj ได้โดยตรง

>msbuild helloworld.csproj -t:Build.

ตรวจสอบเอกสาร msbuild สำหรับการใช้งานข้อกำหนดของไฟล์ proj และประโยชน์ของการสร้างโปรเจ็กต์แทนโซลูชัน

เอกสาร MS MSBuild

มีประโยชน์ในการสร้างด้วยวิธีนี้ตามที่ mark-smith กล่าวไว้ข้างต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.