asp.net 如何获取Visual Studio的“发布”功能以包含来自后期生成事件的文件?

cld4siwp  于 2022-11-19  发布在  .NET
关注(0)|答案(6)|浏览(173)

我目前正在尝试使用Visual Studio 2010“发布”和MSDeploy功能来处理我的Web部署需求,但在根据我的生成配置自定义包方面遇到了障碍。
我在32位环境中开发,但需要为64位环境创建发布包,因此在“发布”配置中,我有一个生成后事件,它将第三方dll的64位版本复制到bin目录,覆盖32位版本。当我使用“发布”功能时,即使正确的64位dll被复制到bin目录,它不会包含在软件包中。
是否有方法让'Publish'包含在建置后事件期间复制到bin目录的档案?

eit6fx6z

eit6fx6z1#

我在How do you include additional files using VS2010 web deployment packages?回答了一个类似但不同的问题。
在您使用生成后事件的场景中,我建议您删除生成后事件,并使用您自己的MSBuild目标而不是生成后事件来实现您的操作。下面是另一个答案的文本。

发件人:How do you include additional files using VS2010 web deployment packages?

很好的问题。我刚刚在Web Deployment Tool (MSDeploy) : Build Package including extra files or excluding specific files上发布了一个关于这个问题的非常详细的博客条目。
这里是概要。在包括文件之后,我也展示了如何排除文件。

包括额外文件

将额外的文件包含到包中有点困难,但如果您熟悉MSBuild,则仍然没有问题,如果您不熟悉,则请阅读本文。为此,我们需要挂钩到收集要打包的文件的进程部分。我们需要扩展的目标称为CopyAllFilesToSingleFolder。此目标具有依赖属性PipelinePreDeployCopyAllFilesToOneFolderDependsOn,因此我们将创建一个名为CustomCollectFiles的目标,并将其注入到进程中。

<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中打开项目文件。右键单击项目,选择“卸载项目”。然后右键单击卸载的项目,选择“编辑项目”。
此语句将包括我们需要的所有目标和任务。如果您不确定是否将if放在导入之后,则大多数定制都应在导入之后进行!因此,如果您要排除某些文件,则需要有一个项名称ExcludeFromPackageFiles,例如,假设您有一个名为Sample. Debug文件js,但您希望从创建的包中排除该文件。您可以将下面的代码片段放在该import语句之后。

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

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

s3fp2yjn

s3fp2yjn2#

我通过使用项目文件中的ExcludeFilesFromDeployment元素找到了解决这个问题的方法。
因此,如果您需要在成功建置和相关的建置后步骤之后,将项目档案封装为项目目录中的档案,请执行下列动作。
1.编辑“打包/发布Web”项目设置并
选择要部署为“此项目文件夹中的所有文件”的项
1.卸载项目
1.右键单击已卸载的项目,然后选择编辑项目配置
1.找到与配置设置(例如“Release”)关联的PropertyGroup元素
1.在PropertyGroup元素中添加以下元素,并排除不需要的文件和文件夹

<ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
<ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>

1.保存并重新加载项目
这暂时解决了我的问题,但如果有更好的解决方案,请让我知道,因为这是不理想的,由于涉及黑客,但话又说回来,也许这是一个不常见的部署场景?

xj3cbfub

xj3cbfub3#

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

daupos2t

daupos2t4#

我知道这是个老问题,但这些都不对我起作用。
在2017 VS我只是右键点击额外的文件夹要发布,并选择发布它的工作.

范例:

camsedfj

camsedfj5#

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

对我来说,我的问题是我需要在bin/文件夹中放置专有软件许可证文件,但不想在每次部署时手动复制它。
这是使用Visual Studio 2015专业版

mzsu5hc0

mzsu5hc06#

我知道这是一个古老的对话,但我偶然发现它,而试图做同样的事情,我认为这将是有帮助的补充我在这里发现。
几乎所有关于在出版物中包含额外文件的文章都使用这种方法,即在PropertyGroup中添加CopyAllFilesToSingleFolderForPackageDependsOnCopyAllFilesToSingleFolderForMSDeployDependsOn项目,它们都类似于“我将此添加到文件末尾...”
这就是我所做的,我花了一个下午试图找到为什么什么都没有发生,直到我意识到在文件的顶部已经有一个PropertyGroup部分。当我把我的CopyAllFilesToSingleFolderForPackageDependsOn放进那个部分时,它工作得很好。
希望有一天这能节省一些人的时间

相关问题