Làm cách nào để có được chức năng 'Xuất bản' của Visual Studio để bao gồm các tệp từ sự kiện xây dựng bài đăng?


89

Tôi hiện đang cố gắng sử dụng chức năng 'Xuất bản' và MSDeploy của Visual Studio 2010 để xử lý các nhu cầu triển khai web của mình nhưng đã gặp phải rào cản liên quan đến việc tùy chỉnh gói tùy thuộc vào cấu hình bản dựng của tôi.

Tôi phát triển trong môi trường 32 bit nhưng cần tạo gói phát hành cho môi trường 64 bit, vì vậy trong cấu hình 'Bản phát hành', tôi có một sự kiện xây dựng bài đăng sao chép phiên bản 64 bit của dll bên thứ ba vào thư mục bin ghi đè lên phiên bản 32 bit . Khi tôi sử dụng chức năng 'Xuất bản', mặc dù tệp dll 64bit chính xác đang được sao chép vào thư mục bin, nó không được bao gồm trong gói.

Có cách nào để 'Xuất bản' bao gồm các tệp đã được sao chép vào thư mục bin trong sự kiện xây dựng bài đăng không?


1
Nếu bạn sử dụng sự kiện tạo trước thay thế, điều này dường như đã hoạt động như bạn muốn (Visual Studio 2013, mẫu dự án ASP.NET).
bzlm

Dường như họ đã xóa hành vi được tạo trước được đề cập trong nhận xét ở trên trong Visual Studio 2015 trở lên.
justdan23

Câu trả lời:


91

Tôi đã trả lời một câu hỏi tương tự nhưng khác tại Làm cách nào để bạn bao gồm các tệp bổ sung bằng cách sử dụng gói triển khai web VS2010? .

Trong trường hợp của bạn, bạn đang sử dụng sự kiện tạo bài đăng, tôi khuyên bạn nên bỏ sự kiện tạo bài đăng và thực hiện các hành động của mình bằng cách sử dụng các mục tiêu MSBuild của riêng bạn thay vì sự kiện tạo bài đăng. Bên dưới, bạn sẽ tìm thấy nội dung của câu trả lời khác.


Từ: Làm thế nào để bạn bao gồm các tệp bổ sung bằng cách sử dụng gói triển khai web VS2010?


Câu hỏi tuyệt vời. Tôi vừa đăng một mục blog rất chi tiết về điều này tại Công cụ triển khai web (MSDeploy): Gói xây dựng bao gồm các tệp bổ sung hoặc loại trừ các tệp cụ thể .

Đây là tóm tắt. Sau khi bao gồm các tệp, tôi cũng chỉ cách loại trừ các tệp.

Bao gồm các tệp bổ sung

Bao gồm các tệp bổ sung vào gói có khó hơn một chút nhưng vẫn không có bigee nếu bạn cảm thấy thoải mái với MSBuild và nếu bạn không thích thì hãy đọc phần này. Để làm được điều này, chúng ta cần tham gia vào một phần của quy trình thu thập các tệp để đóng gói. Mục tiêu chúng ta cần mở rộng được gọi là CopyAllFilesToSingleFolder. Mục tiêu này có thuộc tính phụ thuộc, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, mà chúng ta có thể khai thác và đưa mục tiêu của riêng mình vào. Vì vậy, chúng tôi sẽ tạo một mục tiêu có tên CustomCollectFiles và đưa nó vào quy trình. Chúng tôi đạt được điều này với những điều sau (hãy nhớ sau câu lệnh nhập).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

Điều này sẽ thêm mục tiêu của chúng tôi vào quy trình, bây giờ chúng tôi cần xác định chính mục tiêu. Giả sử rằng bạn có một thư mục có tên Tệp phụ nằm trên 1 cấp so với dự án web của bạn. Bạn muốn bao gồm tất cả các tệp đó. Đây là mục tiêu CustomCollectFiles và chúng ta sẽ thảo luận sau đó.

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

Ở đây những gì tôi đã làm là tạo mục _CustomFiles và trong thuộc tính Bao gồm yêu cầu nó chọn tất cả các tệp trong thư mục đó và bất kỳ thư mục nào bên dưới nó. Sau đó, tôi sử dụng mục này để điền vào mục FilesForPackagingFromProject. Đây là mục mà MSDeploy thực sự sử dụng để thêm các tệp bổ sung. Cũng lưu ý rằng tôi đã khai báo giá trị DestinationRelativePath siêu dữ liệu. Điều này sẽ xác định đường dẫn tương đối mà nó sẽ được đặt trong gói. Tôi đã sử dụng câu lệnh Extra Files% (RecursiveDir)% (Filename)% (Extension) ở đây. Những gì đang nói là đặt nó ở cùng một vị trí tương đối trong gói như nó nằm trong thư mục Extra Files.

Loại trừ tệp

Nếu bạn mở tệp dự án của ứng dụng web được tạo bằng VS 2010 về phía cuối tệp, bạn sẽ thấy một dòng có.

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

BTW bạn có thể mở tệp dự án bên trong VS. Nhấp chuột phải vào dự án chọn Unload Project. Sau đó nhấp chuột phải vào dự án chưa tải và chọn Chỉnh sửa dự án.

Tuyên bố này sẽ bao gồm tất cả các mục tiêu và nhiệm vụ mà chúng tôi cần. Hầu hết các tùy chỉnh của chúng tôi phải sau lần nhập đó, nếu bạn không chắc hãy đặt nếu sau! Vì vậy, nếu bạn có các tệp cần loại trừ, có một tên mục, ExcludeFromPackageFiles, có thể được sử dụng để làm như vậy. Ví dụ: giả sử bạn có tệp tên Sample.Debug.js được bao gồm trong ứng dụng web của bạn nhưng bạn muốn tệp đó bị loại trừ khỏi các gói đã tạo. Bạn có thể đặt đoạn mã bên dưới sau câu lệnh nhập đó.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

Bằng cách khai báo việc điền mục này, các tệp sẽ tự động bị loại trừ. Lưu ý việc sử dụng siêu dữ liệu FromTarget tại đây. Tôi sẽ không đi sâu vào điều đó ở đây, nhưng bạn nên biết để luôn chỉ rõ điều đó.


1
Cảm ơn Sayed, mặc dù nó không phải là phương pháp thẳng thắn nhất nhưng tôi đoán đây là cách nó được thực hiện.
brodie

8
@ Đã nói, điều này dường như không hoạt động đối với VS2012, bạn có biết cách cập nhật điều này cho trường hợp này không. chuyển sang v11.0 không hoạt động. TIA.
Simon Francesco

2
@Daniel Nếu bạn chỉ cần các tệp cụ thể chứ không phải một thư mục, chỉ cần thay đổi _CustomFiles để bao gồm các tệp cụ thể đó thay vì thêm đệ quy bằng ***. Vì vậy, một cái gì đó giống như <_CustomFiles bao gồm = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles bao gồm = "C: \ Someotherplace \ FileB.txt" /> Một cái gì đó tương tự như vậy.
bwerks

3
@SimonFranceco Tôi cũng gặp phải trường hợp này và thay đổi cần thiết dường như là để mở rộng <CopyAllFilesToSingleFolderForMsdeployDependsOn> thay vì <CopyAllFilesToSingleFolderForPackageDependsOn> như được viết trong câu trả lời ở trên.
bwerks


13

Tôi đã tìm thấy một giải pháp cho sự cố bằng cách sử dụng ExcludeFilesFromDeploymentphần tử trong tệp dự án. Tôi lấy ý tưởng từ Triển khai Web: Loại trừ Tệp và Thư mục

Vì vậy, nếu bạn cần đóng gói các tệp dự án vì chúng tồn tại trong thư mục dự án của bạn sau khi xây dựng thành công và các bước xây dựng bài đăng được liên kết thì hãy làm như sau.

  1. Chỉnh sửa cài đặt dự án "Gói / Xuất bản Web" và
    chọn Các mục để triển khai thành "Tất cả các tệp trong thư mục dự án này"
  2. Dỡ dự án
  3. Nhấp chuột phải vào dự án chưa tải và chọn để chỉnh sửa cấu hình dự án
  4. Xác định vị trí PropertyGroupphần tử được liên kết với cài đặt cấu hình, ví dụ: "Phát hành"
  5. Trong PropertyGroupphần tử, hãy thêm các phần tử sau và loại trừ các tệp và thư mục bạn không muốn trong gói

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
  6. Lưu và tải lại dự án của bạn

Điều này giải quyết được vấn đề của tôi vào lúc này nhưng nếu có giải pháp nào tốt hơn thì vui lòng cho tôi biết, vì điều này không lý tưởng do có liên quan đến hack, nhưng một lần nữa có lẽ đây là một kịch bản triển khai không phổ biến?


6

Chọn tệp hoặc thư mục của bạn và thay đổi hành động Xây dựng dưới dạng Nội dung từ Cửa sổ Thuộc tính.


1
Đúng, nhưng bổ sung là bạn phải chọn "Sao chép nếu mới hơn" hoặc "Sao chép luôn", vì nếu không, hành động mặc định là "Không sao chép", ngay cả khi "Nội dung" được chọn.
Matt

1
đồng ý với matt cho bước bổ sung
Gomes

7
Không có hành động Xây dựng nào cho các thư mục (VS2013)
Cristian E.

copytooutputdirectory = Sao chép luôn
Gomes

Làm việc ngay cả khi không có Sao chép Luôn luôn.
Tengiz

3

Tôi biết đó là một câu hỏi cũ nhưng không câu hỏi nào trong số này phù hợp với tôi.

Vào năm 2017 VS, tôi chỉ cần nhấp chuột phải vào thư mục bổ sung sẽ được xuất bản và chọn xuất bản nó đã hoạt động.

Thí dụ:

nhập mô tả hình ảnh ở đây


Mặc dù nó là một bước bổ sung nhỏ nhưng nó rất đơn giản.
Ciaran Gallagher

0

Việc thêm thư mục bin (và nội dung của nó) vào dự án khiến các tệp được sao chép vào thư mục đầu ra xuất bản.

Đối với tôi, vấn đề của tôi là tôi cần đặt tệp giấy phép phần mềm độc quyền trong bin / thư mục, nhưng không muốn sao chép thủ công mỗi lần triển khai.

Điều này đã được sử dụng Visual Studio 2015 Professional


0

Tôi biết đây là một cuộc trò chuyện cũ nhưng tôi đã bắt gặp nó trong khi cố gắng làm điều tương tự và tôi nghĩ sẽ hữu ích nếu thêm những gì tôi tìm thấy vào đây.

Gần như tất cả các bài viết về việc bao gồm các tệp bổ sung trong ấn phẩm của bạn sử dụng phương pháp này để thêm CopyAllFilesToSingleFolderForPackageDependsOnhoặc CopyAllFilesToSingleFolderForMSDeployDependsOncác mục trong PropertyGroupvà tất cả chúng đều giống nhau như "Tôi đã thêm cái này vào cuối tệp ..."

Đây là những gì tôi đã làm và dành một buổi chiều để cố gắng tìm lý do tại sao không có gì xảy ra cho đến khi tôi nhận ra rằng đã có một PropertyGroupphần ở đầu tệp. Khi tôi đặtCopyAllFilesToSingleFolderForPackageDependsOn vào phần đó, nó hoạt động tốt.

Hy vọng điều này tiết kiệm thời gian cho ai đó vào một ngày nào đó

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.