如何将额外的文件发布到bin文件夹

7
我的 .net web 应用程序项目还包括一些未托管的 dll 作为附加文件。这些文件在子文件夹中有几个层级。
当我发布此项目时,我需要将这些文件复制到 bin 文件夹中,与所有其他二进制文件一起。
无论我尝试什么设置,最好的结果是它们被发布到其现有的文件夹结构中,而不是我需要它们的位置。
我已经创建了一个 PostBuild 事件来复制文件,在本地构建时可以工作,但在发布到服务器时不行。我无法以同样的方式让 PostPublish 事件起作用。
还有其他方法可以实现这一点吗?
注意,这与之前的问题类似,但并不相同: Publish unmanaged DLL from referenced project

1
@JuanR 相似但不完全相同。那个问题是关于输出目录和构建事件的,我特别关注 bin 目录和发布(构建事件不会在发布时触发)。 - userSteve
我明白了。你尝试过使用发布后任务吗?https://dev59.com/LmUp5IYBdhLWcg3wvZVV - JuanR
3个回答

8

我有一个类似的设置。我的解决方案中有两个项目,一个是.NET Core,另一个是C++。当我要发布dotnetcoreapp2.2时,我想从另一个项目中包含预编译的C++ DLL。 @JuanR的答案对我不起作用,尽管它已经非常接近我的版本。看起来<ItemGroup>需要在<Target>标记中。

<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
  <ItemGroup>
    <DataModelFiles Include="$(ProjectDir)..\MyCppProject\bin\Release\MyCppProject.dll" />
  </ItemGroup>
  <Copy SourceFiles="@(DataModelFiles)" DestinationFolder="$(PublishDir)" SkipUnchangedFiles="false" />
</Target>

工作得非常出色。通过添加<Target Name="PostBuild" AfterTargets="PostBuildEvent">,有很多灵活性。我现在能够在构建和发布时复制全局.json文件。我还有开发文件和只在本地运行时适用的机密文件。 - drewid

4
尝试使用发布后任务。 您可以为文件复制创建一个项目组:
<ItemGroup>
  <binFilesToCopy Include="$(OutDir)\somepath\to\yourexternalDLLFolder\*" />
  <!-- Add more folders/files you want to copy here -->
</ItemGroup>

然后在发布后添加一个目标:

<Target Name="AfterPublish">
    <Copy SourceFiles ="@(binFilesToCopy)" DestinationFolder ="$(OutDir)\bin" />
</Target>

我主要是凭记忆完成的,因此请检查语法,但你应该能理解。


1
在文件属性中,您可以将复制到输出目录设置为始终复制,或者您可以编辑解决方案文件,展开所需文件的xml标签,并添加<CopyToOutputDirectory>Always</CopyToOutputDirectory>作为子标记。

不幸的是,这会将整个文件夹结构复制到 bin 文件夹中,我只需要文件本身位于 bin 根目录而不是任何子文件夹中。 - userSteve
@userSteve,你能否把文件放在解决方案的根目录中吗? - Tobias Brohl
1
这并不理想。我有12个文件,让它们挂在项目的根目录下会相当混乱。它们现在所在的文件夹结构整洁明了,说明了它们的用途。 - userSteve
@userSteve:你看到我关于发布后任务的评论了吗?这不同于事件。 - JuanR
1
@userSteve:不一定。有内置任务可以复制文件,无需批处理文件。您应该能够将bin文件夹用作目标。 - JuanR
显示剩余3条评论

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