如何让Visual Studio的“发布”function包含来自后期构build事件的文件?
我目前正在尝试使用Visual Studio 2010的“发布”和MSDeployfunction来处理我的Web部署需求,但根据我的构buildconfiguration,我们已经遇到了一个包装方面的问题。
我在32位环境下开发,但需要为64位环境创build发行包,所以在“发行”configuration中,我有一个后期构build事件,将64位版本的第三方dll复制到bin目录中,覆盖32位版本。 当我使用“发布”function时,即使将正确的64位dll拷贝到bin目录,也不会包含在包中。
有没有办法让“发布”包含在发布后事件中复制到bin目录中的文件?
我回答了一个类似但不同的问题: 如何使用VS2010 Web部署包包含其他文件? 。
在你的场景中,你正在使用后期构build事件,我会build议删除后期构build事件,并使用自己的MSBuild目标而不是后期构build事件来实现你的动作。 在下面你会发现其他答案的文字。
发件人: 你如何使用VS2010 web部署包包含其他文件?
伟大的问题。 我只是在Web部署工具(MSDeploy)上发布了一个非常详细的博客文章:包含额外文件或排除特定文件的构build包 。
这里是大纲。 包含文件之后,我还展示了如何排除文件。
包括额外的文件
如果你对MSBuild感到满意,包括额外的文件到软件包中有点困难,但是如果你没有阅读, 为了做到这一点,我们需要勾选收集文件进行打包的部分。 我们需要扩展的目标称为CopyAllFilesToSingleFolder。 这个目标有一个依赖属性,PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以挖掘并注入我们自己的目标。 所以我们将创build一个名为CustomCollectFiles的目标并将其注入进程。 我们用下面的方法实现这个(在import语句之后记得)。
<PropertyGroup> <CopyAllFilesToSingleFolderForPackageDependsOn> CustomCollectFiles; $(CopyAllFilesToSingleFolderForPackageDependsOn); </CopyAllFilesToSingleFolderForPackageDependsOn> </PropertyGroup>
这将把我们的目标添加到过程中,现在我们需要定义目标本身。 假设您有一个名为额外文件的文件夹,位于您的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>
在这里我做的是创build项目_CustomFiles,并在包含属性告诉它拿起该文件夹中的所有文件和它下面的任何文件夹。 然后我使用这个项目来填充FilesForPackagingFromProject项目。 这是MSDeploy实际用于添加额外文件的项目。 另外请注意,我声明了元数据DestinationRelativePath的值。 这将决定它将被放置在包中的相对path。 我在这里使用了Extra Files%(RecursiveDir)%(Filename)%(Extension)语句。 这是说,将它放在包中的相同的相对位置,因为它在Extra文件夹下。
排除文件
如果您打开VS 2010创build的Web应用程序的项目文件,则会find一行。
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
顺便说一句,你可以打开VS中的项目文件。 右键单击项目select卸载项目。 然后右键单击卸载的项目,然后select编辑项目。
这个声明将包括我们需要的所有目标和任务。 我们大多数的自定义应该在导入之后,如果你不确定放在后面的话! 因此,如果您有要排除的文件,则可以使用项目名称ExcludeFromPackageFiles来执行此操作。 例如,假设您的Web应用程序中包含名为Sample.Debug.js的文件,但是您希望将该文件从创build的包中排除。 您可以在该导入语句之后放置下面的代码片段。
<ItemGroup> <ExcludeFromPackageFiles Include="Sample.Debug.xml"> <FromTarget>Project</FromTarget> </ExcludeFromPackageFiles> </ItemGroup>
通过声明填充这个项目,文件将被自动排除。 请注意这里使用FromTarget元数据。 我不会在这里进入,但你应该知道总是指定。
我通过使用项目文件中的ExcludeFilesFromDeployment
元素find了解决此问题的方法。 我从Web部署的想法:排除文件和文件夹
因此,如果您需要在项目目录中存在项目文件,那么在成功构build和关联的构build后步骤之后,请执行以下操作。
- 编辑“打包/发布网站”项目设置和
select要部署的项目为“此项目文件夹中的所有文件” - 卸载项目
- 右键单击卸载的项目,然后select编辑项目configuration
- find与configuration设置关联的
PropertyGroup
元素,例如“Release” -
在
PropertyGroup
元素中添加以下元素,并排除不需要包中的文件和文件夹<ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment> <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
-
保存并重新加载您的项目
这暂时解决了我的问题,但如果有更好的解决scheme,请让我知道,因为这是不理想的,因为涉及hackery,但是可能这是一个不常见的部署scheme?
select您的文件或文件夹,并将“更改生成”操作作为“属性”窗口中的“
将bin文件夹(及其内容)添加到项目中导致将文件复制到发布输出目录。
对我来说,我的问题是,我需要将一个专有的软件许可证文件放在bin /文件夹中,但不想在每个部署中手动复制它。
这是使用Visual Studio 2015专业版