如何获得Visual Studio的“发布”功能以包含来自构建后事件的文件?


89

我目前正在尝试使用Visual Studio 2010的“发布”和MSDeploy功能来满足我的Web部署需求,但是在根据我的构建配置自定义软件包方面遇到了障碍。

我在32位环境中进行开发,但需要为64位环境创建发行包,因此在“发布”配置中,我有一个后期构建事件,该事件将64位版本的第三方dll复制到bin目录中,从而覆盖32位版本。当我使用“发布”功能时,即使正确的64位dll被复制到bin目录,它也不会包含在软件包中。

有没有一种方法可以使“发布”包含在构建后事件期间已复制到bin目录中的文件?


1
如果改用pre- build事件,这似乎可以按照您想要的方式工作(Visual Studio 2013,ASP.NET项目模板)。
bzlm

他们似乎已删除了Visual Studio 2015及更高版本中以上注释中提到的预建行为。
justdan23

Answers:


91

我在“ 如何使用VS2010 Web部署程序包包括其他文件”中回答了类似但不同的问题

在您使用场景的事件后,我建议您删除事件后事件,并使用自己的MSBuild目标而不是事件后事件来实施操作。在下面,您将找到其他答案的文本。


来自:如何使用VS2010 Web部署程序包包含其他文件?


好问题。我刚刚在Web部署工具(MSDeploy)上发布了一个关于此的非常详细的博客条目:构建包,包括额外的文件或不包括特定的文件

这是摘要。包含文件后,我还将展示如何排除文件。

包括额外文件

如果您对MSBuild感到满意,那么将额外的文件包含到程序包中会比较困难,但是仍然不算什么,如果您不熟悉MSBuild,请阅读此内容。为此,我们需要进入收集文件打包过程的一部分。我们需要扩展的目标称为CopyAllFilesToSingleFolder。该目标具有依赖项属性PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以利用该属性插入自己的目标。因此,我们将创建一个名为CustomCollectFiles的目标,并将其注入到流程中。我们通过以下方式实现这一点(请记住import语句之后)。

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

这会将我们的目标添加到流程中,现在我们需要定义目标本身。假设您有一个名为Extra Files的文件夹,该文件夹位于Web项目的上一级。您要包括所有这些文件。这是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应用程序中,但是您希望将该文件从创建的包中排除。您可以将该代码段放在该import语句之后。

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

通过声明填充此项目,文件将被自动排除。请注意FromTarget元数据的用法。我在这里不做讨论,但是您应该知道始终指定它。


1
感谢Sayed,尽管这不是最直接的方法,但我想这是完成的方法。
布罗迪2010年

8
@说,这似乎不适用于VS2012,您知道如何针对这种情况进行更新。更改为v11.0无效。TIA。
西蒙·弗朗切斯科

2
@Daniel如果只需要特定的文件而不是文件夹,则只需更改_CustomFiles以包括这些特定的文件,而不用***递归添加即可。所以类似<_CustomFiles Include =“ .. \ Dependencies \ FileA.dll” /> <_ CustomFiles Include =“ C:\ Someotherplace \ FileB.txt” />类似的东西。
bwerks

3
@SimonFrancesco我也经历了这一点,并且必要的更改似乎是扩展了<CopyAllFilesToSingleFolderForMsdeployDependsOn>而不是扩展上述答案中的<CopyAllFilesToSingleFolderForPackageDependsOn>。
bwerks


13

通过使用ExcludeFilesFromDeployment项目文件中的元素,我找到了解决该问题的方法。我从Web部署中得到了一个想法:排除文件和文件夹

因此,如果您需要在成功构建和相关的构建后步骤之后打包项目文件,因为它们存在于项目目录中,则请执行以下操作。

  1. 编辑“打包/发布Web”项目设置,然后
    选择要部署的项目作为“此项目文件夹中的所有文件”
  2. 卸载项目
  3. 右键单击已卸载的项目,然后选择以编辑项目配置
  4. 找到与PropertyGroup配置设置关联的元素,例如“发布”
  5. PropertyGroup元素中添加以下元素,并排除包中不需要的文件和文件夹

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
  6. 保存并重新加载您的项目

这暂时解决了我的问题,但是如果有更好的解决方案,那么请让我知道,由于涉及到黑客,这并不理想,但这又是不常见的部署方案吗?


6

选择文件或文件夹,然后从“属性”窗口中将“生成”操作更改为“内容”。


1
正确,但还必须选择“如果较新则复制”或“始终复制”,因为否则,即使选择了“内容”,默认操作也是“不复制”。
马特

1
同意亚光采取进一步措施
Gomes 2015年

7
没有针对文件夹的构建操作(VS2013)
Cristian E.

copytooutputdirectory =始终复制
Gomes

即使没有始终复制也可以工作。
Tengiz

3

我知道这是一个老问题,但是这些都不对我有用。

在2017年VS中,我右键单击要发布的额外文件夹,然后选择发布它起作用。

例:

在此处输入图片说明


尽管这是一个很小的额外步骤,但它非常简单。
Ciaran Gallagher

0

将bin文件夹(及其内容)添加到项目中会导致文件被复制到发布输出目录。

对我来说,我的问题是我需要将专有软件许可证文件放在bin /文件夹中,但不想在每个部署中手动复制它。

这是使用Visual Studio 2015专业版


0

我知道这是一次古老的谈话,但是我在尝试做相同的事情时遇到了它,我认为添加在这里找到的内容会有所帮助。

几乎所有关于在出版物中包含额外文件的文章都使用这种在中添加CopyAllFilesToSingleFolderForPackageDependsOnCopyAllFilesToSingleFolderForMSDeployDependsOn项目的方法PropertyGroup,它们都具有类似“我已将其添加到文件末尾...”的方式。

这就是我所做的,并且花了一个下午的时间试图找出为什么什么也没发生,直到我意识到PropertyGroup文件顶部已经有一个区域。当我CopyAllFilesToSingleFolderForPackageDependsOn进入该部分时,它工作正常。

希望这可以节省某人的时间

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.