Sử dụng MSBuild.exe để "Xuất bản" dự án ASP.NET MVC 4 với dòng cmd


82

Tôi đang tìm một lệnh để chạy ngược lại lệnh MSBuild.exechỉ lấy một dự án MVC 4 và xuất bản nó vào một thư mục nhất định.

Ví dụ,

MSBuild <solution>/<project>.csproj -publish -output=c:/folder

Đây rõ ràng là cú pháp không chính xác. Tôi đang cố gắng đơn giản hóa câu hỏi của mình.

Câu hỏi này nói về một XML xây dựng, nhưng tôi không cố gắng làm bất cứ điều gì với nhiều chi tiết đó.

Tôi chỉ đơn giản là đang cố gắng triển khai.

Xa hơn trong câu hỏi đó, có người nói về "MSDeploy". Tôi có thể xem xét điều đó, nhưng nó có phải là lựa chọn duy nhất? Tôi không có khả năng cài đặt triển khai web trên máy chủ. Trong trường hợp đó, tất cả những gì tôi thực sự cần làm là "Xuất bản" và gửi nội dung của dự án đã xuất bản đến một thư mục nhất định trên máy chủ / tệp-hệ thống.

Có ai có một lớp lót tôi có thể sử dụng?

Tôi có phải sử dụng MSDeploy không?

MSDeploy có yêu cầu cài đặt triển khai web trên máy chủ không?

Việc thiết lập triển khai web trên máy chủ có yêu cầu thiết lập một số cổng, quyền và cài đặt một số tiện ích bổ sung IIS không?

Tôi muốn thực hiện một cái gì đó đơn giản.

Câu trả lời:


152

Trong VS 2012 (cũng như các bản cập nhật xuất bản có sẵn trong Azure SDK cho VS 2010), chúng tôi đã đơn giản hóa việc xuất bản dòng lệnh cho các dự án web. Chúng tôi đã thực hiện điều đó bằng cách sử dụng Xuất bản Hồ sơ.

Trong VS cho một dự án web, bạn có thể tạo hồ sơ xuất bản bằng hộp thoại xuất bản. Khi bạn tạo hồ sơ đó, hồ sơ đó sẽ tự động được lưu trữ trong dự án của bạn dưới Thuộc tính \ PublishProfiles. Bạn có thể sử dụng cấu hình đã tạo để xuất bản từ dòng lệnh với một dòng lệnh sau đây.

msbuild mysln.sln /p:DeployOnBuild=true /p:PublishProfile=<profile-name>

Nếu bạn muốn lưu trữ hồ sơ xuất bản (tệp .pubxml) ở một số vị trí khác, bạn có thể chuyển đường dẫn đến PublishProfile.

Hồ sơ xuất bản là các tệp MSBuild. Nếu bạn cần tùy chỉnh quy trình xuất bản, bạn có thể làm như vậy trực tiếp bên trong tệp .pubxml.

Nếu mục tiêu cuối cùng của bạn là chuyển các thuộc tính từ dòng lệnh. Tôi muốn giới thiệu những điều sau đây. Tạo một hồ sơ xuất bản mẫu trong VS. Kiểm tra hồ sơ xuất bản đó để xác định những thuộc tính MSBuild nào bạn cần chuyển vào trên dòng lệnh. FYI không phải tất cả các phương pháp xuất bản đều hỗ trợ xuất bản dòng lệnh (tức là FTP / FPSE).

FYI nếu bạn đang xây dựng .csproj / .vbproj thay vì .sln và bạn đang sử dụng VS 2012, bạn cũng nên chuyển sang /p:VisualStudioVersion=11.0. Để biết thêm chi tiết về lý do tại sao, hãy xem http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx .


3
Tôi nghĩ OP chỉ đơn giản là muốn "triển khai" ứng dụng web vào một thư mục tùy ý trên máy cục bộ của mình.
Richard Szalay 19/12/12

3
vì vậy, trên một máy chủ triển khai, một người sẽ cần cài đặt IDE của Visual Studio để có được một lệnh như vậy hoạt động?
Erik5388 20/12/12

2
hoặc có thể tôi chỉ làm điều này: microsoft.com/en-us/download/details.aspx?id=30670
Erik5388

10
Điều này có hoạt động trong VS 2013 không? Chạy cùng một dòng lệnh, không xuất bản. Không có lỗi cũng không. Thử nghiệm với việc triển khai hệ thống tệp đơn giản trong hồ sơ xuất bản. xây dựng công trình, không có kết quả xuất bản. Đích đến trống.
Rex Whitten

2
Khi tôi sử dụng này nó xuất bản build gỡ lỗi của tôi dù file .pubxml có <LastUsedBuildConfiguration> Nhả </ LastUsedBuildConfiguration>
reggaeguitar

11

Tạo một tệp build.xml trông giống như bên dưới

Khởi động dấu nhắc lệnh Visual Studio

Chạy msbuild build.xml

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build">

  <PropertyGroup>
    <Build>$(MSBuildProjectDirectory)\Build</Build>
    <ProjectFile>MyProject.csproj</ProjectFile> 
    <ProjectName>MyProjectNameInVisualStudio</ProjectName>
    <CopyTo>$(MSBuildProjectDirectory)\CopyTo</CopyTo>
  </PropertyGroup> 

  <Target Name="Build"> 
    <RemoveDir Directories="$(Build)"/>  
    <MSBuild Projects="$(ProjectFile)" Properties="Configuration=Release;OutputPath=$(Build);OutDir=$(Build)/"></MSBuild>  
    <Exec Command="robocopy.exe  $(Build)\_PublishedWebsites\$(ProjectName) $(CopyTo) /e /is
      if %errorlevel% leq 4 exit 0 else exit %errorlevel%"/>    
  </Target>

</Project>

7
Câu trả lời này rất hữu ích đối với tôi, nhưng có một điều tôi sẽ bổ sung để cải thiện nó. Nếu bạn thực thi nó như đã viết, robocopy sẽ trả về mã thoát 1 để cho biết một bản sao thành công ... khiến msbuild nghĩ rằng bản dựng đã thất bại. Để giải quyết vấn đề này, chỉ cần thêm "if% errorlevel% leq 1 exit 0 else exit% errorlevel%" sau dấu / e trong lệnh robocopy.
Alex

Cả câu trả lời ở trên và nhận xét của Alex đều hữu ích đối với tôi. Tôi cũng sẽ thêm <RemoveDir Directories = "$ (CopyTo)" /> trước </Target> để giữ cho thư mục dự án sạch sẽ.
JackArbiter

6

Lệnh dưới đây hoạt động hoàn hảo:

msbuild Myproject.sln  /t:Rebuild /p:outdir="c:\outproject\\" /p:Configuration=Release /p:Platform="Any CPU"

3
khi bạn chỉ muốn xuất bản các tệp nội dung, điều này sẽ hoạt động. Nhưng biến đổi web.config không thực hiện
andreas

1
Phương pháp này không hoạt động để xuất bản trang web MVC (lượt xem không được sao chép)
eka808

Đối với một ứng dụng web như API Web, hai tệp quan trọng không được tạo trong thư mục bin: App_global.asax.dll và App_global.asax.compiled. Tôi khuyên bạn nên sử dụng ví dụ của Sayed ở trên.
Fred Peters

1

Tôi tìm thấy câu trả lời sayed đang triển khai cấu hình mặc định tức là Gỡ lỗi. Cấu hình được chọn trong Hồ sơ xuất bản dường như bị MSBuild bỏ qua. Theo đó, tôi đã thay đổi lệnh để chỉ định cấu hình chính xác cho việc triển khai ...

msbuild mysln.sln /p:Configuration=[config-name] /p:DeployOnBuild=true /p:PublishProfile=[profile-name]

nơi config-name = Bản phát hành hoặc một số cấu hình bản dựng khác mà bạn đã tạo


0

Với các dự án web bạn cần xây dựng, như trên, nhưng sau đó bạn cũng cần phải đóng gói / sao chép. Chúng tôi sử dụng bản sao tệp, thay vì "xuất bản" ...

Cũng thế; chúng tôi sử dụng DEBUG / RELEASE để xây dựng trang web; nhưng sau đó là môi trường thực tế, tức là "QA" hoặc "PROD" để xử lý các biến đổi web.config.

Vì vậy, chúng tôi xây dựng nó ban đầu với RELEASE, sau đó đóng gói nó bằng QA - trong ví dụ bên dưới.

  <PropertyGroup>   
    <SolutionName>XXX.Website</SolutionName>
    <ProjectName>XXX.Website</ProjectName>
    <IisFolderName>XXX</IisFolderName>

    <SolutionConfiguration>QA</SolutionConfiguration> <!--Configuration will be set based on user selection-->   

    <SolutionDir>$(MSBuildThisFileDirectory)..</SolutionDir>
    <OutputLocation>$(SolutionDir)\bin\</OutputLocation>
     <WebServer>mywebserver.com</WebServer>
  </PropertyGroup>

  <Target Name="BuildPackage">
    <MSBuild Projects="$(SolutionDir)\$(SolutionName).sln" ContinueOnError="false" Targets="Clean;Rebuild" Properties="Configuration=Release" />
    <MSBuild Projects="$(SolutionDir)\$(ProjectName)\$(ProjectName).csproj" ContinueOnError="false" Targets="Package" Properties="Configuration=$(SolutionConfiguration);AutoParameterizationWebConfigConnectionStrings=False" />
  </Target>

  <Target Name="CopyOutput">
    <ItemGroup>
      <PackagedFiles Include="$(SolutionDir)\$(ProjectName)\obj\$(SolutionConfiguration)\Package\PackageTmp\**\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\$(WebServer)\$(IisFolderName)\$(SolutionConfiguration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
  </Target>

Vì thế;

  1. Thiết lập thuộc tính của bạn
  2. Gọi mục tiêu BuildPackage
  3. Gọi mục tiêu CopyOutput Và thì đấy!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.