[英]How to get Visual Studio 'Publish' functionality to include files from post build event?
我目前正在尝试使用Visual Studio 2010的“发布”和MSDeploy功能来处理我的Web部署需求,但是根据我的构建配置,遇到了关于自定义程序包的障碍。
我在32位环境中开发但需要为64位环境创建一个发布包,所以在'Release'配置中我有一个post build事件,它将64位版本的第三方dll复制到bin目录中,覆盖32bit版本。 当我使用“发布”功能时,即使正确的64位dll被复制到bin目录,它也不会包含在包中。
有没有办法让'Publish'包含在post build事件期间复制到bin目录中的文件?
我回答了一个类似但不同的问题: 如何使用VS2010 Web部署包包含其他文件? 。
在您的场景中,您正在使用post build事件,我建议使用您自己的MSBuild目标而不是post build事件来删除post build事件并实现您的操作。 您可以在下面找到其他答案的文字。
好问题。 我刚刚在Web部署工具(MSDeploy)上发布了一篇非常详细的博客文章:包括额外文件或排除特定文件的构建包 。
这是概要。 包含文件后,我将展示如何排除文件。
包括额外文件
如果您对MSBuild感到满意,那么将额外的文件包含在包中会有点困难,但仍然没有bigee,如果您不熟悉,那么请阅读此内容。 为了做到这一点,我们需要挂钩收集文件以进行打包的过程部分。 我们需要扩展的目标称为CopyAllFilesToSingleFolder。 这个目标有一个依赖属性,PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以利用它来注入我们自己的目标。 因此,我们将创建一个名为CustomCollectFiles的目标,并将其注入到流程中。 我们通过以下方式实现此目的(请记住import语句之后)。
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>
这会将我们的目标添加到流程中,现在我们需要定义目标本身。 假设您有一个名为Extra Files的文件夹,它位于您的Web项目之上1级。 您想要包含所有这些文件。 这是CustomCollectFiles目标,之后我们将讨论。
<Target Name="CustomCollectFiles">
<ItemGroup>
<_CustomFiles Include="..\Extra Files\**\*" />
<FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
<DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
这里我所做的是创建项目_CustomFiles,并在Include属性中告诉它拾取该文件夹中的所有文件及其下面的任何文件夹。 然后我使用此项来填充FilesForPackagingFromProject项。 这是MSDeploy实际用于添加额外文件的项目。 另请注意,我声明了元数据DestinationRelativePath值。 这将确定它将放置在包中的相对路径。 我在这里使用语句Extra Files%(RecursiveDir)%(Filename)%(Extension)。 这就是将它放在包中与Extra Files文件夹下相同的相对位置。
排除文件
如果您打开使用VS 2010创建的Web应用程序的项目文件,则会在其底部找到一行。
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
顺便说一句,你可以在VS里面打开项目文件。 右键单击项目选择卸载项目。 然后右键单击卸载的项目并选择“编辑项目”。
该声明将包括我们需要的所有目标和任务。 我们的大多数自定义都应该在导入之后,如果您不确定是否放在后面! 因此,如果您要排除文件,则可以使用项目名称ExcludeFromPackageFiles来执行此操作。 例如,假设您有一个名为Sample.Debug.js的文件,该文件包含在您的Web应用程序中,但您希望从创建的包中排除该文件。 您可以在导入语句后面放置代码段。
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
通过声明填充此项目,将自动排除文件。 请注意此处使用FromTarget元数据。 我不会在这里讨论,但你应该知道总是指明这一点。
我通过在项目文件中使用ExcludeFilesFromDeployment
元素找到了解决问题的方法。 我从Web部署中获取了这个想法:排除文件和文件夹
因此,如果在成功构建和关联的构建后步骤之后需要打包项目目录中存在的项目文件,请执行以下操作。
PropertyGroup
元素,例如“Release” 在PropertyGroup
元素中添加以下元素,并排除包中不需要的文件和文件夹
<ExcludeFilesFromDeployment>*.cs;**\\.svn\\**\\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment> <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
保存并重新加载项目
这暂时解决了我的问题但是如果有更好的解决方案那么请告诉我,因为涉及到hackery这不是理想的,但是这可能是一个不常见的部署方案?
选择文件或文件夹,然后将“构建操作”更改为“属性窗口中的内容
将bin文件夹(及其内容)添加到项目会导致文件被复制到发布输出目录。
对我来说,我的问题是我需要在bin /文件夹中放置一个专有软件许可证文件,但不希望每次部署都手动复制它。
这是使用Visual Studio 2015 Professional
我知道这是一个古老的对话,但我在尝试做同样的事情时遇到了它,我认为添加我在这里找到的内容会很有帮助。
几乎所有关于在您的出版物中包含额外文件的文章都使用这种方法在PropertyGroup
中添加CopyAllFilesToSingleFolderForPackageDependsOn
或CopyAllFilesToSingleFolderForMSDeployDependsOn
项目,它们都像“我将其添加到文件的末尾......”
这就是我所做的,并花了一个下午试图找到为什么没有发生任何事情,直到我意识到文件顶部已经有一个PropertyGroup
部分。 当我将CopyAllFilesToSingleFolderForPackageDependsOn
放入该部分时,它工作正常。
希望有一天能节省一些时间
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.