【问题标题】:Exclude files from web site publish in Visual Studio从网站中排除文件在 Visual Studio 中发布
【发布时间】:2009-03-16 15:18:48
【问题描述】:

我可以在 Visual Studio 2005 中发布网站时排除文件夹或文件吗?我想在解决方案资源管理器中保留各种资源,例如各种环境的备用配置文件,但我真的不想将它们发布到服务器。有什么办法可以排除它们吗?当使用其他项目类型时,例如 .dll 程序集,我可以将文件的 Build Action 属性设置为“None”,并将其 Copy to Output Directory 属性设置为“Do not copy”。我在网站中找不到任何类似的文件设置。

如果 IDE 不提供此功能,有没有人有很好的技术来处理此类文件?

【问题讨论】:

标签: visual-studio visual-studio-2005 web-publishing


【解决方案1】:

通过将ExcludeFilesFromDeploymentExcludeFoldersFromDeployment 元素添加到您的项目文件(.csproj、.vbproj 等)来排除文件和文件夹。您需要在文本编辑器中编辑该文件,或者在 Visual Studio 中通过卸载项目然后对其进行编辑。

在适当的PropertyGroup(调试、发布等)中的任意位置添加标签,如下所示:

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

支持通配符。

解释上面的例子:

  • 第一个ExcludeFilesFromDeployment 不包括File1.aspx(在项目的根目录中)和Folder2\File2.aspxFolder2 在项目的根目录中)
  • 第二个ExcludeFilesFromDeployment 不包括任何名为.svn 的文件夹及其任何子文件夹中的所有文件
  • ExcludeFoldersFromDeployment 不包括名为 Folder1(在项目根目录中)和 Folder2\Folder2aFolder2 在项目根目录中)的文件夹

有关详细信息,请参阅 MSDN 博客文章Web Deployment: Excluding Files and Folders via the Web Application’s Project File

【讨论】:

  • 有没有办法用这个来使用通配符?
  • 这比我接受的答案要好得多,因为我想在发布期间排除 Web.config 文件!
  • 在“网站”类型的项目中,此代码 sn-p 被添加到位于 ~/App_Data/PublishProfiles/ 中的 *.pubxml 文件中。
  • 在 Web 应用程序中,您可以将这些元素添加到您发布配置文件的 PropertyGroup @ ~\Properties\PublishProfiles
  • 有什么方法可以通过 UI 而不是直接编辑项目文件?
【解决方案2】:

令人惊讶的是,Visual Studio 2012 的答案不在这里:

  • 带有绿色复选标记的答案不是答案。

  • 最高的“更新”答案引用了 2010 年的一篇文章,并说您必须编辑您的 csproj 项目文件,该文件现在不正确。我将 ExcludeFoldersFromDeployment XML 元素添加到我的 Visual Studio 2012 csproj 文件中,但它什么也没做,该元素被认为是无效的,这是因为 ExcludeFoldersFromDeployment 已移动到看起来像的 .pubxml 文件中。

对于 Web 应用程序和网站,您可以编辑 .pubxml 文件!

您可以按照我的回答或尝试我稍后找到的本指南: http://www.leniel.net/2014/05/using-msdeploy-publish-profile-pubxml-to-create-an-empty-folder-structure-on-iis-and-skip-deleting-it-with-msdeployskiprules.html#sthash.MSsQD8U1.dpbs

是的,您不仅可以为网站项目执行此操作,还可以为网站执行此操作。我在互联网上花了很长时间寻找 Visual Studio 网站(不是网站项目)的这种难以捉摸的排除功能,之前得出的结论是不可能的,但看起来是这样的:

在您的 [mypublishwebsitename].pubxml 文件中,在 ~/Properties/PublishProfiles 中找到 Web 应用程序项目和 ~/App_Data/PublishProfiles 中的网站,只需添加:

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

作为 .pubxml 文件中主要 &lt;PropertyGroup&gt; 元素的子元素。除非您键入特定的构建类型,例如发布或调试,否则无需添加新元素。

等一下!!!

如果您在发布配置中使用以下设置从目标/目标服务器中删除文件:

然后,Web 发布过程将在您的源/目标服务器上删除任何排除的内容,例如您在 &lt;ExcludeFoldersFromDeployment&gt;&lt;ExcludeFilesFromDeployment&gt; 中描述的项目!

MsDeploy 跳过规则救援:

首先,Web Publish 使用 MSBuild 以外的其他东西来发布(称为 Task IO 或类似的东西),但它有一个错误并且无法识别跳过规则,因此您必须添加到您的 .pubxml:

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

我会将&lt;WebPublishMethod&gt; 保留在它自己的&lt;PropertyGroup&gt; 中,你会认为你可以在你的.pubxml 中只有一个&lt;PropertyGroup&gt; 元素,但是直到我将&lt;WebPublishMethod&gt; 移动到它自己的&lt;PropertyGroup&gt; 元素。是的,很疯狂,但是您需要为 Web Publish 执行所有这些操作才能排除并且不删除服务器上的文件夹/文件,这很疯狂。

现在我的 .pubxml 中的实际 SkipRules、ExcludeFolders 和 ExcludeFiles 声明:

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

现在是跳过规则(&lt;Target&gt; 是 .pubxml 中&lt;Project&gt; 的子项): (您可以将 &lt;SkipAction&gt; 留空以跳过所有操作,但我没有对此进行测试并且不确定。

  <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>

请不要忘记使用反斜杠转义 filePath Skip 规则中的 .

【讨论】:

    【解决方案3】:

    如果您可以根据扩展名识别文件,则可以使用buildproviders tag in the web.config 进行配置。添加扩展并将其映射到 ForceCopyBuildProvider。例如,要将 .xml 文件配置为通过发布操作进行复制,您可以执行以下操作:

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

    为了防止给定文件被复制,您可以做同样的事情,但使用 System.Web.Compilation.IgnoreFileBuildProvider 作为类型。

    【讨论】:

    • 超级酷。 wpp.targets 文件中推荐的 ExcludeFromPackageFiles 没有运气。后者相当没用,因为它似乎不支持文件夹深度超过一层的通配符。谢谢
    【解决方案4】:

    我在同样的问题上苦苦挣扎,最终触发将网站转换为 Web 应用程序。完成此操作后,我就获得了 IDE 的所有优势,例如构建操作,并且编译速度更快(无需验证网站...)。

    第 1 步:将您的“网站”转换为“网络应用程序”。为了转换它,我刚刚创建了一个新的“Web 应用程序”,吹走了它自动创建的所有文件,然后复制并粘贴了我的网站。这很好。请注意,报告文件需要将其构建操作设置为“内容”而不是“无”。

    第 2 步:现在您可以设置任何文件的“构建操作”属性。

    希望这会有所帮助。

    【讨论】:

      【解决方案5】:

      在 Visual Studio 2013 中,我找到了 Keith 的答案,将 ExcludeFoldersFromDeployment 元素添加到项目文件中,但没有用(我没有读过 Brian Ogden 的回答,其中提到了这一点)。但是,我发现我可以在 Visual Studio 2013 中发布时排除文本文件,只需在文本文件本身上设置以下属性:

      1) 构建操作:无

      2) 复制到输出目录:不要复制

      最初我尝试自行设置“复制到输出目录”属性,但是当“构建操作”设置为默认值“内容”时,这不起作用。然后,当我将 Build Action 设置为 None 时,文本文件在我发布时不再复制到目标文件夹。

      要在 Visual Studio GUI 中查看这些属性,请在解决方案资源管理器中右键单击要排除的文件,然后从上下文菜单中选择属性。

      【讨论】:

      • 这适用于 Visual Studio 2015 发布到 Azure。
      • 问题是您需要仅针对某些目标环境(构建配置)排除的文件。这很痛苦。
      【解决方案6】:

      我认为您在这里只有两个选择:

      • 使用“从项目中排除” 特征。这并不理想,因为 项目项目将被排除在外 任何集成的 IDE 源代码控制操作。 您需要单击“显示全部” 解决方案窗口上的“文件”按钮 如果您需要查看文件 解决方案资源管理器,但也 显示你不是的文件和文件夹 有兴趣。
      • 使用构建后事件脚本 删除您不删除的任何项目项 想要发表(假设你是 然后发布到本地文件夹 上传到服务器)。

      我以前也经历过,但想不出任何真正优雅的东西。

      【讨论】:

        【解决方案7】:

        对于 Visual Studio 2017,WebApp Publish,首先创建标准文件系统发布配置文件。 转到 App_Data\PublishProfiles\ 文件夹并编辑 [profilename].pubxml 文件。

        添加

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

        标签下&lt;PropertyGroup&gt; 这个标签只能指定一次,否则只会取最后一个的值。

        例子:

        <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>
        

        确保标签 DeleteExistingFiles 设置为 False

        【讨论】:

        • Nico 你是全科医生吗?为 MCI 工作过?
        【解决方案8】:

        如果您的项目创建为“Web 应用程序”,则您正在寻找的功能存在。 Web 站点“项目”只是一个文件集合,这些文件被认为是与部署到 Web 服务器的 1:1 文件的集合。

        就功能而言,两者是相同的,但是 Web 应用程序将所有源代码编译为 DLL,而不是将裸源代码文件复制到 Web 服务器并根据需要进行编译。

        【讨论】:

          【解决方案9】:

          这只是对此处其他有用答案的补充,以及我发现有用的东西......

          使用 wpp.targets 排除文件和文件夹

          当您针对不同环境进行多个部署时,最好只有一个通用文件,您可以在其中设置所有排除的文件和文件夹。您可以通过在项目的根目录中创建一个*.wpp.targets 文件来做到这一点,如下例所示。

          有关详细信息,请参阅此 Microsoft 指南:

          How to: Edit Deployment Settings in Publish Profile (.pubxml) Files and the .wpp.targets File in Visual Studio Web Projects

          <?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>
          

          【讨论】:

            【解决方案10】:

            在 Visual Studio 2017(在我的情况下为 15.9.3)中,.csproj 文件的操作确实可以正常工作!无需修改pubxml。

            然后您可以使用 PropertyGroup 条件在 .csproj-File 中构建非常好的设置,例如:

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

            从所有配置以“Pub_”开头的部署中排除“Samples”文件夹...

            【讨论】:

            • 我验证这适用于 Visual Studio 2017 而不应用“条件”属性。
            【解决方案11】:

            作为当代答案,在带有 .net 核心站点的 Visual Studio 2017 中:

            您可以像在 csproj 中那样从发布中排除,其中 CopyToPublishDirectory 永远不会。

              <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>
            

            这里有更详细的讨论: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>
            

            之前的建议对我不起作用,我猜是因为 Visual Studio 现在在下面使用不同的发布机制,我推测是通过“dotnet publish”cli 工具或下面的等效工具。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-01-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多