พบคำตอบที่นี่:
http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
Visual Studio 2010 มีคุณลักษณะการเผยแพร่โครงการเว็บแอปพลิเคชันใหม่ที่ช่วยให้คุณเผยแพร่โครงการเว็บแอปของคุณได้อย่างง่ายดายด้วยการคลิกปุ่ม เบื้องหลังการแปลง Web.config และการสร้างแพ็กเกจทำได้โดยสคริปต์ MSBuild ขนาดใหญ่ที่นำเข้าสู่ไฟล์โครงการของคุณ (พบได้ที่: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft .Web.Publishing.targets) น่าเสียดายที่สคริปต์มีความซับซ้อนอย่างมากยุ่งเหยิงและไม่มีเอกสาร (อื่น ๆ แล้วบางส่วนสะกดไม่ดีและส่วนใหญ่เป็นความคิดเห็นที่ไร้ประโยชน์ในไฟล์) ผังงานขนาดใหญ่ของไฟล์นั้นและเอกสารบางอย่างเกี่ยวกับวิธีการเชื่อมต่อมันจะดี แต่ดูเหมือนว่าจะขาดหายไปอย่างน่าเศร้า (หรืออย่างน้อยก็หาไม่เจอ)
น่าเสียดายที่นั่นหมายความว่าการเผยแพร่ผ่านทางบรรทัดคำสั่งนั้นทึบแสงมากกว่าที่ควรจะเป็น ฉันรู้สึกประหลาดใจกับการขาดเอกสารในพื้นที่นี้เพราะทุกวันนี้ร้านค้าจำนวนมากใช้เซิร์ฟเวอร์การรวมแบบต่อเนื่องและบางแห่งก็ใช้งานอัตโนมัติ (ซึ่งคุณสมบัติการเผยแพร่ VS2010 สามารถช่วยได้มาก) ดังนั้นฉันจึงคิดว่าการเปิดใช้งานสิ่งนี้ ( ได้อย่างง่ายดาย!) จะเป็นข้อกำหนดหลักสำหรับคุณลักษณะนี้
อย่างไรก็ตามหลังจากขุดผ่านไฟล์ Microsoft.Web.Publishing.targets เป็นเวลาหลายชั่วโมงและกระแทกหัวของฉันกับกำแพงการทดลองและข้อผิดพลาดฉันได้จัดการเพื่อหาวิธีที่ Visual Studio ดูเหมือนจะทำงานได้อย่างวิเศษเพียงคลิกเดียว "เผยแพร่ไปยังระบบไฟล์" และคุณสมบัติ“ Build Deployment Package” ฉันจะเข้าสู่การเขียนสคริปต์ MSBuild เล็กน้อยดังนั้นหากคุณไม่คุ้นเคยกับ MSBuild ฉันขอแนะนำให้คุณดูหน้า MSDN ของหลักสูตรความผิดพลาดนี้
เผยแพร่ไปยังระบบไฟล์
กล่องโต้ตอบการเผยแพร่ไปยังระบบไฟล์ VS2010 การเผยแพร่ไปยังระบบไฟล์ใช้เวลาสักครู่ในการเลิกใช้เพราะฉันคาดว่าจะมีการใช้ MSBuild อย่างสมเหตุสมผล แต่ VS2010 กลับทำสิ่งที่ค่อนข้างแปลก: มันเรียก MSBuild เพื่อทำการปรับใช้แบบครึ่งหนึ่งซึ่งเตรียมไฟล์ของเว็บแอพในโฟลเดอร์ obj ของโปรเจ็กต์ของคุณจากนั้นดูเหมือนว่าจะทำสำเนาไฟล์เหล่านั้นด้วยตนเอง (เช่นภายนอก MSBuild) ลงในโฟลเดอร์เผยแพร่เป้าหมายของคุณ นี่เป็นพฤติกรรมการตีอย่างแท้จริงเนื่องจาก MSBuild ได้รับการออกแบบมาเพื่อคัดลอกไฟล์รอบ ๆ (และสิ่งอื่น ๆ ที่เกี่ยวข้องกับการสร้าง) ดังนั้นจึงสมเหตุสมผลถ้ากระบวนการทั้งหมดเป็นเพียงเป้าหมาย MSBuild เดียวที่ VS2010 เรียกร้องไม่ใช่เป้าหมายจากนั้นเป็นสำเนาคู่มือ
ซึ่งหมายความว่าการทำเช่นนี้ผ่าน MSBuild บนบรรทัดคำสั่งนั้นไม่ง่ายเหมือนกับการเรียกไฟล์โปรเจ็กต์ของคุณด้วยเป้าหมายเฉพาะและตั้งค่าคุณสมบัติบางอย่าง คุณจะต้องทำสิ่งที่ VS2010 ควรทำ: สร้างเป้าหมายด้วยตัวคุณเองที่ดำเนินการปรับใช้ครึ่งหนึ่งจากนั้นคัดลอกผลลัพธ์ไปยังโฟลเดอร์เป้าหมาย หากต้องการแก้ไขไฟล์โครงการของคุณให้คลิกขวาที่โครงการใน VS2010 แล้วคลิกยกเลิกการโหลดโครงการจากนั้นคลิกขวาอีกครั้งแล้วคลิกแก้ไข เลื่อนลงไปจนกว่าคุณจะพบอิลิเมนต์อิมพอร์ตที่อิมพอร์ตเป้าหมายเว็บแอ็พพลิเคชัน (Microsoft.WebApplication.targets ไฟล์นี้เองนำเข้าไฟล์ Microsoft.Web.Publishing.targets ที่กล่าวถึงก่อนหน้านี้) ภายใต้บรรทัดนี้เราจะเพิ่มเป้าหมายใหม่ของเราที่เรียกว่า PublishToFileSystem:
<Target Name="PublishToFileSystem"
DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
<Error Condition="'$(PublishDestination)'==''"
Text="The PublishDestination property must be set to the intended publishing destination." />
<MakeDir Condition="!Exists($(PublishDestination))"
Directories="$(PublishDestination)" />
<ItemGroup>
<PublishFiles Include="$(_PackageTempDir)\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(PublishFiles)"
DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="True" />
</Target>
เป้าหมายนี้ขึ้นอยู่กับเป้าหมาย PipelinePreDeployCopyAllFilesToOneFolder ซึ่งเป็นสิ่งที่ VS2010 เรียกก่อนที่จะทำสำเนาด้วยตนเอง การขุดรอบ ๆ ใน Microsoft.Web.Publishing.targets แสดงให้เห็นว่าการเรียกเป้าหมายนี้ทำให้ไฟล์โครงการถูกวางลงในไดเร็กทอรีที่ระบุโดยคุณสมบัติ _PackageTempDir
งานแรกที่เราเรียกในเป้าหมายของเราคืองาน Error ซึ่งเราได้วางเงื่อนไขที่ทำให้มั่นใจได้ว่างานจะเกิดขึ้นหากยังไม่ได้ตั้งค่าคุณสมบัติ PublishDestination สิ่งนี้จะจับคุณและสร้างข้อผิดพลาดในกรณีที่คุณลืมระบุคุณสมบัติ PublishDestination จากนั้นเราจะเรียกงาน MakeDir เพื่อสร้างไดเร็กทอรี PublishDestination หากยังไม่มีอยู่
จากนั้นเรากำหนดรายการที่เรียกว่า PublishFiles ซึ่งแสดงถึงไฟล์ทั้งหมดที่พบภายใต้โฟลเดอร์ _PackageTempDir จากนั้นงาน Copy จะถูกเรียกซึ่งคัดลอกไฟล์เหล่านั้นทั้งหมดไปยังโฟลเดอร์ Publish Destination แอตทริบิวต์ DestinationFiles ในองค์ประกอบ Copy ค่อนข้างซับซ้อน มันทำการแปลงไอเท็มและแปลงพา ธ ไปยังพา ธ ใหม่ที่รูทที่โฟลเดอร์ PublishDestination (ตรวจสอบข้อมูลเมตาของไอเท็มที่รู้จักกันดีเพื่อดูว่า% () หมายถึงอะไร)
ในการเรียกเป้าหมายนี้จากบรรทัดคำสั่งตอนนี้เราสามารถดำเนินการคำสั่งนี้ได้แล้ว (เห็นได้ชัดว่าเปลี่ยนชื่อไฟล์โครงการและคุณสมบัติให้เหมาะกับคุณ):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
Condition="false"
อยู่สำหรับความเข้ากันได้ย้อนหลัง VS2010 กำหนดให้มีการนำเข้านี้แม้ว่าจะถูกข้ามไปเนื่องจากเงื่อนไขที่ไม่ถูกต้องก็ตาม หากคุณดูอีกครั้งคุณจะเห็นว่า csproj มีการนำเข้าอื่น$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets
ซึ่งแก้ไขไปยังไฟล์เป้าหมายสำหรับ Visual Studio เวอร์ชันปัจจุบัน