我在Visual Studio 2005中发布网站时可以排除一个或多个文件夹吗?我有各种各样的资源,我想在解决方案资源管理器中随身携带,例如各种环境的备用配置文件,但我真的不想将它们发布到服务器。有没有办法排除它们?当使用其他项目类型(例如.dll程序集)时,我可以将文件的Build Action属性设置为“None”,将其Copy to Output Directory属性设置为“Do not copy”。我在网站上找不到任何类似的文件设置。
如果IDE不提供此功能,是否有人有良好的处理此类文件的技术?
答案 0 :(得分:111)
通过将ExcludeFilesFromDeployment
和ExcludeFoldersFromDeployment
元素添加到项目文件(.csproj,.vbproj等)来排除文件夹和文件。将它们添加到适当的PropertyGroup
(调试,发布等)中的任何位置,如下所示:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...
<ExcludeFilesFromDeployment>File1.aspx;Folder2\File2.aspx</ExcludeFilesFromDeployment>
<ExcludeFilesFromDeployment>**\.svn\**\*.*</ExcludeFilesFromDeployment>
<ExcludeFoldersFromDeployment>Folder1;Folder2\Folder2a</ExcludeFoldersFromDeployment>
</PropertyGroup>
支持通配符。
解释上面的例子:
有关详细信息,请参阅Web Deployment: Excluding Files and Folders via the Web Application’s Project File
答案 1 :(得分:32)
令人惊讶的是Visual Studio 2012的答案不在这里:
带绿色复选标记的答案不是答案。
最高&#34;上升&#34;回答参考了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 for Web Application Projects和〜/ App_Data / PublishProfiles for websites中找到,只需添加:
<ExcludeFilesFromDeployment>File1.aspx;Folder2\File2.aspx</ExcludeFilesFromDeployment>
<ExcludeFoldersFromDeployment>Folder1;Folder2\Folder2a</ExcludeFoldersFromDeployment>
作为.pubxml文件中主<PropertyGroup>
元素的子项。除非您键入特定的构建类型,例如发布或调试,否则无需添加新元素。
但等待!!!
如果要使用发布配置中的以下设置从目标/目标服务器中删除文件:
然后,Web发布流程将在您的源/目标服务器上删除任何被排除的内容,例如您在<ExcludeFoldersFromDeployment>
和<ExcludeFilesFromDeployment>
中描述的项目!
MsDeploy跳过救援规则:
首先,Web Publish使用除MSBuild之外的其他东西来发布(称为Task IO或类似的东西),但它有一个bug并且无法识别跳过规则,所以你必须添加到你的.pubxml:
<PropertyGroup>
<WebPublishMethod>MSDeploy</WebPublishMethod>
</PropertyGroup>
我会将<WebPublishMethod>
保留在自己的<PropertyGroup>
中,你会认为你的.pubxml中只能有一个<PropertyGroup>
元素,但我的Skip Rules直到我将<WebPublishMethod>
移到了自己的<PropertyGroup>
元素中。是的,很疯狂,但是您需要为Web Publish执行所有这些以排除并且不删除服务器上的文件夹/文件的事实是疯狂的。
现在我的.pubxml中的实际SkipRules,ExcludeFolders和ExcludeFiles声明:
<ExcludeFoldersFromDeployment>Config</ExcludeFoldersFromDeployment>
<ExcludeFoldersFromDeployment>Photos</ExcludeFoldersFromDeployment>
<ExcludeFoldersFromDeployment>Temp</ExcludeFoldersFromDeployment>
<ExcludeFilesFromDeployment>Web.config</ExcludeFilesFromDeployment>
<AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>
现在一个跳过规则(<Target>
是.pubxml中<Project>
的孩子):
(您可以将<SkipAction>
留空以跳过所有操作,但我没有对此进行测试但不确定。
<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规则中的.
。
答案 2 :(得分:29)
如果您可以根据扩展名识别文件,则可以使用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作为类型。
答案 3 :(得分:11)
我在同样的问题上挣扎,并最终取消了将网站转换为网络应用程序的触发器。一旦我这样做了,我就获得了所有IDE的好处,例如构建操作,并且编译速度更快(不再需要验证网站......)。
第1步:将“网站”转换为“网络应用程序”。为了转换它,我刚刚创建了一个新的“Web应用程序”,自动删除了它创建的所有文件,并复制并粘贴了我的网站。这很好用。请注意,报告文件需要将其Build Action设置为“Content”而不是“none”。
步骤2:现在您可以设置任何文件“Build Action”属性。
希望这有帮助。
答案 4 :(得分:6)
在Visual Studio 2013中,我找到了Keith的答案,将ExcludeFoldersFromDeployment
元素添加到项目文件中,没有用(我没有读过Brian Ogden的回答,这说明了这一点)。但是,我发现只要在文本文件本身上设置以下属性,我就可以在Visual Studio 2013中发布时排除文本文件:
1)构建动作:无
2)复制到输出目录:不要复制
最初我尝试自行设置“复制到输出目录”属性,但是当“构建操作”设置为默认值“内容”时,该属性不起作用。当我将Build Action设置为None时,我发布时不再将文本文件复制到目标文件夹。
要在Visual Studio GUI中查看这些属性,请在解决方案资源管理器中右键单击要排除的文件,然后从上下文菜单中选择“属性”。
答案 5 :(得分:5)
我认为你这里只有两个选择:
我以前经历过这个,并且无法想出任何非常优雅的东西。
答案 6 :(得分:1)
如果您的项目是作为“Web应用程序”创建的,则您正在查找的功能存在。 Web 站点“项目”只是一组被认为是1:1的文件,其中包含部署到Web服务器的文件。
在功能方面两者都是相同的,但是Web应用程序将所有源代码编译为DLL,而不是将裸源代码文件复制到Web服务器并根据需要进行编译。
答案 7 :(得分:1)
对于Visual Studio 2017, WebApp发布,首先创建标准文件系统发布配置文件。 转到App_Data \ PublishProfiles \文件夹并编辑[profilename] .pubxml文件。
添加
<ExcludeFilesFromDeployment>[file1.ext];[file2.ext];[file(n).ext]</ExcludeFilesFromDeployment>
标记<PropertyGroup>
下的您只能指定一次此标记,否则只会使用最后一个标记值。
示例:
<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
答案 8 :(得分:0)
在Visual Studio 2017中(以我的情况为15.9.3),对.csproj文件的操作确实可以正常工作!无需修改pubxml。
然后您可以使用PropertyGroup条件在.csproj文件中构建非常漂亮的设置,例如:
<PropertyGroup Condition="$(Configuration.StartsWith('Pub_'))">
<ExcludeFoldersFromDeployment>Samples</ExcludeFoldersFromDeployment>
</PropertyGroup>
以“ Pub_”开头的配置从所有部署中排除“ Samples”文件夹。
答案 9 :(得分:0)
作为一个当代的答案,在带有.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>
<PropertyGroup>
<ExcludeFilesFromDeployment>appsettings.Local.json</ExcludeFilesFromDeployment>
</PropertyGroup>
我猜较早的建议对我不起作用,因为Visual Studio现在在下面使用了不同的发布机制,我想通过“ dotnet publish” cli工具或下面的等效工具。
答案 10 :(得分:0)
这只是这里其他有用答案的附录,我发现有些有用的东西...
使用wpp.targets排除文件和文件夹
当您针对不同的环境进行多个部署时,只有一个公共文件可以在其中设置所有排除的文件和文件夹,这将很有帮助。您可以通过在项目的根目录中创建一个data
文件来完成此操作,如下例所示。
有关详细信息,请参阅此Microsoft指南:
data = handler.getnames();