Loại trừ các tệp khỏi trang web xuất bản trong Visual Studio


79

Tôi có thể loại trừ một thư mục hoặc các tệp khi tôi xuất bản một trang web trong Visual Studio 2005 không? Tôi có nhiều tài nguyên khác nhau mà tôi muốn giữ lại trong Trình khám phá giải pháp, chẳng hạn như tệp cấu hình thay thế cho các môi trường khác nhau, nhưng tôi không thực sự muốn xuất bản chúng lên máy chủ. Có một số cách để loại trừ chúng? Khi sử dụng các loại dự án khác, chẳng hạn như tập hợp .dll, tôi có thể đặt thuộc tính Build Action của tệp thành "Không" và thuộc tính Copy to Output Directory của nó thành "Không sao chép". Tôi không thể tìm thấy bất kỳ cài đặt tương tự nào cho các tệp trong một trang web.

Nếu IDE không cung cấp tính năng này, có ai có kỹ thuật tốt để xử lý các tệp như vậy không?


3
Tại đây bạn có thể tìm thấy một giải pháp rất đơn giản: stackoverflow.com/questions/1288858/…
Dmitriy Melnik

Câu trả lời:


32

Nếu bạn có thể xác định các tệp dựa trên phần mở rộng, bạn có thể định cấu hình phần mở rộng này bằng cách sử dụng thẻ buildproviders trong web.config . Thêm tiện ích mở rộng và ánh xạ nó vào ForceCopyBuildProvider. Ví dụ: để định cấu hình tệp .xml được sao chép bằng hành động xuất bản, bạn sẽ thực hiện như sau:

<configuration>...
    <system.web>...
        <compilation>...
            <buildProviders>
                <remove extension=".xml" />
                <add extension=".xml" type="System.Web.Compilation.ForceCopyBuildProvider" />
            </buildProviders>

Để giữ cho một tệp nhất định không bị sao chép, bạn sẽ làm điều tương tự nhưng sử dụng System.Web.Compilation.IgnoreFileBuildProvider làm loại.


Siêu mát. Không gặp may với các tệp ExcludeFromPackageFiles được đề xuất trong tệp wpp.targets. Cái thứ hai khá vô dụng vì nó dường như không hỗ trợ các ký tự đại diện với các thư mục sâu hơn một cấp. Cảm ơn
DvS

127

Loại trừ các tệp và thư mục bằng cách thêm ExcludeFilesFromDeploymentExcludeFoldersFromDeploymentcác phần tử vào tệp dự án của bạn (.csproj, .vbproj, v.v.). Bạn sẽ cần chỉnh sửa tệp trong trình soạn thảo văn bản hoặc trong Visual Studio bằng cách dỡ bỏ dự án và sau đó chỉnh sửa nó.

Thêm các thẻ vào bất kỳ đâu trong phạm vi thích hợp PropertyGroup(Gỡ lỗi, Phát hành, v.v.) như được hiển thị bên dưới:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
  ... 
  <ExcludeFilesFromDeployment>File1.aspx;Folder2\File2.aspx</ExcludeFilesFromDeployment> 
  <ExcludeFilesFromDeployment>**\.svn\**\*.*</ExcludeFilesFromDeployment>
  <ExcludeFoldersFromDeployment>Folder1;Folder2\Folder2a</ExcludeFoldersFromDeployment> 
</PropertyGroup>

Các ký tự đại diện được hỗ trợ.

Để giải thích ví dụ trên:

  • Ngày 1 ExcludeFilesFromDeploymentkhông bao gồm File1.aspx(trong thư mục gốc của dự án) và Folder2\File2.aspx( Folder2là trong thư mục gốc của dự án)
  • Thứ hai ExcludeFilesFromDeploymentloại trừ tất cả các tệp trong bất kỳ thư mục nào có tên .svnvà bất kỳ thư mục con nào của nó
  • Loại ExcludeFoldersFromDeploymenttrừ các thư mục có tên Folder1(trong thư mục gốc của dự án) và Folder2\Folder2a( Folder2trong thư mục gốc của dự án)

Để biết thêm thông tin, hãy xem bài đăng trên blog MSDN Triển khai Web: Loại trừ Tệp và Thư mục qua Tệp Dự án của Ứng dụng Web


1
Có cách nào để sử dụng ký tự đại diện với cái này không?
roydukkey

4
Điều này tốt hơn nhiều so với câu trả lời được chấp nhận đối với tôi vì tôi muốn loại trừ tệp Web.config trong khi Xuất bản!
Michael Eakins

6
Trên các dự án loại "Trang web", đoạn mã này được thêm vào tệp * .pubxml nằm trong ~ / App_Data / PublishProfiles /.
laylarenee

4
Trong một ứng dụng web, bạn có thể thêm các phần tử này vào Nhóm thuộc tính mà bạn xuất bản hồ sơ @ ~ \ Thuộc tính \ PublishProfiles
ExecutionOrder

6
Có cách nào để thực hiện việc này thông qua giao diện người dùng thay vì chỉnh sửa tệp dự án trực tiếp không?
Kurren

35

Thật ngạc nhiên, câu trả lời cho Visual Studio 2012 không có ở đây:

  • Câu trả lời với dấu kiểm màu xanh lá cây không phải là câu trả lời.

  • Câu trả lời "nâng cao" cao nhất đề cập đến một bài báo từ năm 2010 và cho biết bạn phải chỉnh sửa tệp dự án csproj của mình, tệp này hiện không chính xác. Tôi đã thêm phần tử XML ExcludeFoldersFromDeployment vào tệp csproj Visual Studio 2012 của mình và nó không làm gì cả, phần tử được coi là không hợp lệ, điều này là do ExcludeFoldersFromDeployment đã được chuyển sang tệp .pubxml.

Đối với Ứng dụng Web và Trang web, bạn chỉnh sửa tệp .pubxml!

Bạn có thể làm theo câu trả lời của tôi hoặc thử hướng dẫn này mà tôi tìm thấy sau: http://www.leniel.net/2014/05/using-msdeploy-publish-profile-pubxml-to-create-an-empty-folder-osystem- on-iis-and-via-delete-it-with-msdeployskiprules.html # sthash.MSsQD8U1.dpbs

Có, bạn có thể làm điều này không chỉ cho các Dự án Trang web mà còn cho các Trang web. Tôi đã dành một thời gian dài trên internet để tìm kiếm khả năng loại trừ khó nắm bắt này với Trang web Visual Studio (KHÔNG phải dự án Trang web) và trước đó đã kết luận là không thể nhưng có vẻ như nó là:

Trong tệp .pubxml [mypublishwebsitename] của bạn, được tìm thấy trong ~ / Properties / PublishProfiles for Web Application Projects và ~ / App_Data / PublishProfiles for Websites, chỉ cần thêm:

  <ExcludeFilesFromDeployment>File1.aspx;Folder2\File2.aspx</ExcludeFilesFromDeployment> 
 <ExcludeFoldersFromDeployment>Folder1;Folder2\Folder2a</ExcludeFoldersFromDeployment>

<PropertyGroup>phần tử chính trong tệp .pubxml của bạn. Không cần thêm phần tử mới trừ khi bạn đang quan tâm đến một loại bản dựng cụ thể, chẳng hạn như bản phát hành hoặc gỡ lỗi.

NHƯNG CHỜ !!!

Nếu bạn đang xóa tệp khỏi máy chủ đích / đích bằng cài đặt sau trong cấu hình Xuất bản của mình:

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

Sau đó, quy trình Xuất bản trên web sẽ xóa trên máy chủ nguồn / máy chủ đích của bạn bất kỳ thứ gì bị loại trừ, chẳng hạn như một mục bạn đã phân định trong <ExcludeFoldersFromDeployment><ExcludeFilesFromDeployment>!

MsDeploy Bỏ qua các quy tắc để giải cứu:

Đầu tiên, Web Publish sử dụng thứ gì đó khác ngoài MSBuild để xuất bản (được gọi là Task IO hoặc thứ gì đó tương tự) nhưng nó có một lỗi và sẽ không nhận ra các quy tắc bỏ qua, vì vậy bạn phải thêm vào .pubxml của mình:

<PropertyGroup>
    <WebPublishMethod>MSDeploy</WebPublishMethod>
</PropertyGroup>

Tôi sẽ giữ <WebPublishMethod>riêng nó <PropertyGroup>, bạn sẽ nghĩ rằng bạn có thể chỉ có một <PropertyGroup>phần tử trong .pubxml của mình nhưng Quy tắc bỏ qua của tôi không được gọi cho đến khi tôi chuyển <WebPublishMethod>sang <PropertyGroup>phần tử của chính nó . Đúng vậy, thật điên rồ, nhưng thực tế là bạn cần làm tất cả những điều này để Web Publish loại trừ và cũng không xóa thư mục / tệp trên máy chủ của bạn là một điều điên rồ.

Bây giờ các khai báo SkipRules, ExcludeFolders và ExcludeFiles thực tế của tôi trong .pubxml:

<ExcludeFoldersFromDeployment>Config</ExcludeFoldersFromDeployment>
<ExcludeFoldersFromDeployment>Photos</ExcludeFoldersFromDeployment>
<ExcludeFoldersFromDeployment>Temp</ExcludeFoldersFromDeployment>
<ExcludeFilesFromDeployment>Web.config</ExcludeFilesFromDeployment>
 <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>

Và bây giờ là Quy tắc bỏ qua ( <Target>là con <Project>trong .pubxml của bạn): ( Bạn có thể để <SkipAction>trống cho Bỏ qua cho tất cả các hành động nhưng tôi đã không kiểm tra điều đó và không chắc chắn.

  <Target Name="AddCustomSkipRules">
    <Message Text="Adding Custom Skip Rules" />
    <ItemGroup>
      <MsDeploySkipRules Include="SkipConfigFolder">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Config</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipPhotosFolder">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Photos</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipWebConfig">
        <SkipAction>Delete</SkipAction>
        <ObjectName>filePath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Web\.config</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipWebConfig">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Temp</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
    </ItemGroup>
  </Target>

Và xin đừng quên thoát .quy tắc Bỏ qua trong filePath bằng dấu gạch chéo ngược.


11

Tôi đã vật lộn với vấn đề tương tự và cuối cùng đã kích hoạt chuyển đổi trang web thành ứng dụng web. Khi tôi làm điều này, tôi nhận được tất cả các lợi ích của IDE như hành động xây dựng và nó được biên dịch nhanh hơn để khởi động (không cần xác thực trang web nữa ...).

Bước 1: Chuyển đổi 'trang web' của bạn thành 'ứng dụng web'. Để chuyển đổi nó, tôi vừa tạo một "ứng dụng web" mới, tự động loại bỏ tất cả các tệp mà nó tạo ra, đồng thời sao chép và dán trang web của tôi vào. Điều này hoạt động tốt. Lưu ý rằng các tệp báo cáo sẽ cần phải đặt Hành động xây dựng thành "Nội dung" thay vì "không".

Bước 2: Bây giờ bạn có thể đặt bất kỳ tệp nào thuộc tính "Build Action".

Hi vọng điêu nay co ich.


7

Trong Visual Studio 2013, tôi tìm thấy câu trả lời của Keith, thêm ExcludeFoldersFromDeploymentphần tử vào tệp dự án, không hoạt động (tôi chưa đọc câu trả lời của Brian Ogden cho biết điều này). Tuy nhiên, tôi thấy mình có thể loại trừ tệp văn bản khi xuất bản trong Visual Studio 2013 bằng cách chỉ đặt các thuộc tính sau trên chính tệp văn bản:

1) Hành động xây dựng: Không có

2) Sao chép vào Thư mục đầu ra: Không sao chép

Ban đầu, tôi đã thử đặt thuộc tính Copy to Output Directory nhưng điều đó không hoạt động khi Hành động xây dựng được đặt thành giá trị mặc định, Nội dung. Sau đó, khi tôi đặt Hành động xây dựng thành Không, tệp văn bản không còn được sao chép vào thư mục đích khi tôi xuất bản.

Để xem các thuộc tính này trong Visual Studio GUI, trong Trình khám phá giải pháp, hãy nhấp chuột phải vào tệp bạn muốn loại trừ và chọn Thuộc tính từ trình đơn ngữ cảnh.


Điều này hoạt động trong Visual Studio 2015 xuất bản lên Azure.
Chris

2
Vấn đề là khi bạn chỉ cần loại trừ tệp cho một số môi trường mục tiêu nhất định (Cấu hình xây dựng). Thật là đau đớn.
benmccallum

5

Tôi nghĩ bạn chỉ có hai lựa chọn ở đây:

  • Sử dụng tính năng 'Loại trừ khỏi Dự án'. Điều này không lý tưởng vì mục dự án sẽ bị loại trừ khỏi bất kỳ hoạt động kiểm soát nguồn IDE tích hợp nào. Bạn cần phải nhấp vào nút 'Hiển thị Tất cả Tệp' trên cửa sổ Giải pháp nếu bạn cần xem các tệp trong Giải pháp Explorer, nhưng điều đó cũng hiển thị các tệp và thư mục mà bạn không quan tâm.
  • Sử dụng tập lệnh sự kiện sau xây dựng để xóa bất kỳ mục dự án nào bạn không muốn xuất bản (giả sử bạn đang xuất bản vào thư mục cục bộ sau đó tải lên máy chủ).

Tôi đã trải qua điều này trước đây và không thể nghĩ ra bất cứ thứ gì thực sự tao nhã.


2

Đối với Visual Studio 2017, WebApp Publish , trước tiên hãy tạo một hồ sơ xuất bản hệ thống tệp tiêu chuẩn. Đi tới thư mục App_Data \ PublishProfiles \ và chỉnh sửa tệp .pubxml [profilename].

Thêm vào

<ExcludeFilesFromDeployment>[file1.ext];[file2.ext];[file(n).ext]</ExcludeFilesFromDeployment>

dưới thẻ <PropertyGroup> Bạn chỉ có thể chỉ định thẻ này một lần, nếu không thẻ sẽ chỉ nhận các giá trị cuối cùng.

Thí dụ:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>True</ExcludeApp_Data>
    <publishUrl>C:\inetput\mysite</publishUrl>
    <DeleteExistingFiles>False</DeleteExistingFiles>
    <ExcludeFilesFromDeployment>web.config;mysite.sln;App_Code\DevClass.cs;</ExcludeFilesFromDeployment>
  </PropertyGroup>
</Project>

Đảm bảo rằng thẻ DeleteExistingFiles được đặt thành False


Nico bạn đến từ GP? Làm việc cho MCI?
Namphibian 13/1218

1

Tính năng bạn đang tìm tồn tại nếu dự án của bạn được tạo dưới dạng "Ứng dụng web". Web Site "dự án" chỉ là một bộ sưu tập các tập tin được coi là 1: 1 với những gì được triển khai tới một máy chủ web.

Về mặt chức năng, cả hai đều giống nhau, tuy nhiên một ứng dụng web biên dịch tất cả mã nguồn thành một DLL, thay vì các tệp mã nguồn trống được sao chép vào máy chủ web và được biên dịch khi cần thiết.


0

Trong Visual Studio 2017 (trong trường hợp của tôi là 15.9.3), thao tác với .csproj-File thực sự hoạt động tốt! Không cần phải sửa đổi pubxml.

Sau đó, bạn có thể tạo các cài đặt khá đẹp trong tệp .csproj-File bằng điều kiện PropertyGroup, ví dụ:

  <PropertyGroup Condition="$(Configuration.StartsWith('Pub_'))">
    <ExcludeFoldersFromDeployment>Samples</ExcludeFoldersFromDeployment>
  </PropertyGroup>

loại trừ thư mục "Mẫu" khỏi tất cả các triển khai có cấu hình bắt đầu bằng "Pub _" ...


Tôi xác minh rằng điều này hoạt động cho Visual Studio 2017 mà không áp dụng thuộc tính "Điều kiện".
Erdem KAYA

0

Như một câu trả lời đương đại, trong Visual Studio 2017 với trang lõi .net:

Bạn có thể loại trừ khỏi việc xuất bản như vậy trong csproj, nơi CopyToPublishDirectory không bao giờ có.

  <ItemGroup>
    <Content Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </Content>
    <Content Update="appsettings.Local.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </Content>
  </ItemGroup>

Điều này được thảo luận chi tiết hơn tại đây: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.2

<PropertyGroup>
    <ExcludeFilesFromDeployment>appsettings.Local.json</ExcludeFilesFromDeployment>
</PropertyGroup>

Các đề xuất trước đó không phù hợp với tôi, tôi đoán vì visual studio hiện đang sử dụng một cơ chế xuất bản khác bên dưới, tôi đoán qua công cụ cli "dotnet xuất bản" hoặc công cụ tương đương bên dưới.


0

Đây chỉ là một phụ lục cho các câu trả lời hữu ích khác ở đây và một cái gì đó tôi thấy hữu ích ...

Sử dụng wpp.targets để loại trừ các tệp và thư mục

Khi bạn có nhiều triển khai cho các môi trường khác nhau thì sẽ hữu ích khi chỉ có một tệp chung, nơi bạn có thể đặt tất cả các tệp và thư mục bị loại trừ. Bạn có thể làm điều này bằng cách tạo một *.wpp.targetstệp trong thư mục gốc của dự án như ví dụ bên dưới.

Để biết thêm thông tin, hãy xem hướng dẫn này của Microsoft:

Cách thực hiện: Chỉnh sửa Cài đặt Triển khai trong Tệp Hồ sơ Xuất bản (.pubxml) và Tệp .wpp.targets trong Dự án Web Visual Studio

<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <EnableMSDeployAppOffline>True</EnableMSDeployAppOffline>
    <ExcludeFilesFromDeployment>
      *.config;
      *.targets;
      *.default;
    </ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>
      images;
      videos;
      uploads;
    </ExcludeFoldersFromDeployment>
  </PropertyGroup>
</Project>
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.