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

11
我有一个Web应用程序项目,引用了第三方程序集,该程序集又使用一些本地dll,在运行时需要找到它们。 因此,我想将这些dll添加到项目的bin文件夹中,以便它们可以被找到。
但是,如果我将文件添加到/bin/中的项目中,并选择“复制到输出”,则文件将被编译并发布到/bin/bin中。将它们添加到根文件夹中可以工作,但几乎不可能是正确的解决方案。
将它们添加到构建目标“AfterBuild”中在发布时没有效果(例如,“构建部署包”)。
它还必须在通过TFS构建解决方案时工作,其中调用MSBuild目标_CopyWebApplicationLegacy。
3个回答

10

解决方案是将我已经尝试过的东西组合起来:

  • 包含 "Bin" 文件夹在项目中
  • 添加所需的文件(由于我们的开发结构,我将它们作为链接添加)
  • 设置以下属性:"Build Action = Content" 和 "Copy to Output = Do Not Copy"

这些文件现在在发布时会被复制到 bin 文件夹中,即使在 TFS 上自动化构建也是如此。

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


最简单、最干净的解决方案。 - AnthonyVO
4
将 Bin 文件夹包含在源代码控制下会导致不必要的提交。 - Catherine
8
Bin文件夹不应成为解决方案的一部分,它只是一个输出文件夹。如果您使用测试用例、TFS等,输出文件夹将会被重定向。将选项设置为“不复制”会导致缺少程序集。很抱歉说:“非常糟糕的想法”。 - Fried
你可以将bin文件夹包含进来,而不必包含其中的所有文件——这也是我认为答案所建议的。通过从它们原始位置链接文件,您也不必检查这些文件。如果您有一个.gitignore规则来忽略bin下的文件,那么您也会没问题。对于那些不知道如何“链接”文件的人,您可以右键单击并选择添加现有项...然后选择文件并使用添加按钮旁边的下拉菜单来“添加为链接”。 - Bron Davies

4
在解决方案或工作区中有一个“lib”文件夹来存放第三方dll是很常见的。然后您可以从项目中添加对此位置的引用,并确保此位置在源代码控制下。
您还可以考虑使用NuGet为您打包,它会自动使用解决方案级别的packages文件夹。

这对我如何处理外部汇编需要找到这些文件有帮助? - Alex AIT
@Alex 如果你的项目中引用了这些文件,它会找到它们。你能指定这些库是哪些吗? - dove
它们是本地dll(我认为是c++),因此无法像普通引用一样添加。所引用的程序集GdPicture在运行时访问它们。 - Alex AIT
@Alex 1. 尝试将lib文件夹包含在您的项目中,并在属性中将文件设置为CopyLocal,这应该可以解决问题。2. 当您尝试将它们添加为引用的dll时会发生什么?3. 在服务器上将它们添加到GAC是否是一个选项? - dove
CopyLocal不能为文件设置,只能为“复制到输出目录”设置。然而,在构建过程中会创建/bin/lib。我无法引用这些dll,因为它们不是.NET程序集。GAC可以工作,但我想避免使用它,因为其他文件也不需要它。 - Alex AIT
显示剩余2条评论

0
基于这篇文章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>

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接