在发布时强制将外部文件复制到 bin 文件夹

Posted

技术标签:

【中文标题】在发布时强制将外部文件复制到 bin 文件夹【英文标题】:Force external files to be copied to bin folder on publish 【发布时间】:2012-09-24 10:01:31 【问题描述】:

我有一个引用第三方程序集的 Web 应用程序项目,该程序集又使用一些需要在运行时找到的本机 dll。 正因为如此,我想把这些dll添加到项目的bin文件夹中,这样肯定可以找到。

但是,如果我将文件添加到 /bin/ 中的项目,选择“复制到输出”,文件将被编译并发布到 /bin/bin。将它们添加到根文件夹可以,但很难成为正确的解决方案。

在发布时将它们添加到构建目标“AfterBuild”没有效果(例如“构建部署包”)

在通过 TFS 构建解决方案时,它也必须工作,其中调用了 MSBuild 目标 _CopyWebApplicationLegacy。

【问题讨论】:

【参考方案1】:

解决方案是结合我已经尝试过的方法:

在项目中包含“Bin”文件夹 添加所需文件(由于我们的开发结构,我将它们添加为链接) 设置以下属性:“构建操作 = 内容”和“复制到输出 = 不复制”

现在,即使在 TFS 上自动构建时,文件也会在发布时复制到 bin 文件夹中。

需要这个的组件是 GdPicture,它在运行时使用了几个本地 DLL。

【讨论】:

最干净、最简单的解决方案。 在源代码管理下包含 Bin 文件夹会导致不必要的签入 bin 文件夹永远不应成为解决方案的一部分。它只是一个输出文件夹。如果您使用测试用例、TFS 等,输出文件夹将被重定向。将选项设置为“不复制”将导致缺少程序集。很抱歉地说:“非常糟糕的主意” 您可以包含 bin 文件夹而不包含其下的所有文件 - 这是我认为答案所暗示的。通过从原始位置链接文件,您也不必签入这些文件。如果您有一个 .gitignore 规则来忽略 bin 下的文件,那么您也会没事的。对于那些不知道如何“链接”到文件的人,您可以右键单击并选择“添加现有项目...”,然后选择该文件并使用“添加”按钮旁边的下拉菜单“添加为链接”【参考方案2】:

在您的解决方案或工作区中有一个 lib 文件夹来放置您的第三方 dll 是很常见的。然后,您将从您的项目中添加对该位置的引用,并确保该位置处于源代码控制之下。

您也可以考虑使用NuGet 为您打包,它会自动使用解决方案级别的包文件夹。

【讨论】:

这对我必须找到这些文件的外部程序集有何帮助? @Alex 如果您在项目中引用了这些文件,它会找到它们。你能指定这些是哪些库吗? 它们是本机 dll(我认为是 c++),因此不能作为普通参考添加。引用的程序集 GdPicture 在运行时访问它们。 @Alex 1. 尝试将 lib 文件夹包含在您的项目中,并在属性中将文件设置为 CopyLocal,应该这样做。 2. 当您尝试将它们添加为引用的 dll 时会发生什么? 3. 是否可以将它们添加到服务器上的 GAC 中? 无法为文件设置CopyLocal,只能“复制到输出目录”。但是,这将导致在构建期间创建 /bin/lib。我无法引用这些 dll,因为它们不是 .NET 程序集。 GAC 会起作用,但我想避免它,因为其他文件也不需要它。【参考方案3】:

基于这篇文章http://sedodream.com/2010/05/01/WebDeploymentToolMSDeployBuildPackageIncludingExtraFilesOrExcludingSpecificFiles.aspx。可以将 msbuild 目标定义到主项目文件中(按解决方案的构建顺序最新),该项目文件将捕获 bin 文件夹的所有文件。像这样

<Target Name="CustomCollectFiles">
    <ItemGroup>
      <_CustomFiles Include="$(OutDir)\**\*" />
      <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
        <DestinationRelativePath>$(OutDir)\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
  </Target>
  <PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>
  </PropertyGroup>

并将其放置在关闭根项目元素之前。

【讨论】:

以上是关于在发布时强制将外部文件复制到 bin 文件夹的主要内容,如果未能解决你的问题,请参考以下文章

引用 DLL 文件未与部署项目一起复制到 bin,导致错误

由于 vmwp.exe 文件锁定,Visual Studio 构建在将文件复制到 bin 目录时失败

DLL 引用未复制到项目 bin

java如何加载一个外部的类或class文件

Jetbrains Datagrip 2017.1.3,在将数据转储到 sql 插入文件时强制导出列

无法将文件从 obj\Debug 复制到 bin\Debug