VS2010 如何在项目中包含文件,在构建或发布过程中自动将它们复制到构建输出目录

Posted

技术标签:

【中文标题】VS2010 如何在项目中包含文件,在构建或发布过程中自动将它们复制到构建输出目录【英文标题】:VS2010 How to include files in project, to copy them to build output directory automatically during build or publish 【发布时间】:2011-06-03 13:09:59 【问题描述】:

任务是形成 Visual Studio 2010 项目,以便在任何构建或发布期间将一些 foo.exe 实用程序复制到输出 (bin) 目录。

早期我在 .csproj(MSBuild 文件)中完成了 PostBuildEvent 任务:

<PropertyGroup>
  <PostBuildEvent>
    Copy "$(SolutionDir)Tools\foo.exe" "$(ProjectDir)$(OutDir)foo.exe"
  </PostBuildEvent>
</PropertyGroup>

但这并不是普遍的。在发布期间 (Visual Studio 2010) foo.exe 出现在 bin 目录中,但不会复制到输出发布目录。也许我做的一切都完全错了,并且有标准机制可以将文件包含在以后的项目中,在构建或发布期间,复制到bin

【问题讨论】:

【参考方案1】:

还有另一种方法可以复制解决方案“外部”的项目(这在技术上也可以复制解决方案项目)。

在解决方案资源管理器中,右键单击您的项目并选择“添加...现有项目”。找到有问题的文件(可以是任何类型,而不仅仅是代码),然后单击“添加”按钮旁边的下拉箭头并选择“添加为链接”。

在解决方案资源管理器中,选择刚刚添加到项目中的项目,并将Copy to Output Directory 属性更改为Copy if newerCopy always,视情况而定。

【讨论】:

【参考方案2】:
    将文件添加到您的项目中。 转到该文件的属性。 将“构建操作”设置为嵌入式资源。 将“复制到输出目录”设置为始终复制。

【讨论】:

这仅适用于 .NET 还是与 naitive 相关? @serup 适用于 Visual Studio。 发布应用程序时它是否工作我想在发布时保留 abc.txt 文件【参考方案3】:

我的神经受损的同志们可能会在这里偶然发现它,我曾假设,对于 Web 项目,如果链接文件是外部 .config 文件,那么“输出目录”将与 web.config 相同的目录存在于,即您的 Web 项目的根目录中。回想起来,将链接文件复制到 root/bin 文件夹中是完全不足为奇的。

因此,如果它是一个 appSettings 包含文件,那么您的 web.config 的打开标签将是

&lt;appSettings file=".\bin\includedAppSettingsFile.config"&gt;

呃。

【讨论】:

【参考方案4】:

尝试直接从您的服务/网络项目中添加对缺失 dll 的引用。添加对不同项目的引用对我不起作用。

我只需要在发布我的网络应用程序时这样做,因为它没有复制所有必需的 dll。

【讨论】:

【参考方案5】:

我只需要在构建期间推送文件,所以我只是添加了一个构建后事件命令行条目,如下所示:

Copy /Y "$(SolutionDir)Third Party\SomeLibrary\*" "$(TargetDir)"

您可以通过在解决方案资源管理器中右键单击您的项目,然后在属性 > 构建事件中进行设置

【讨论】:

如果你使用这种方式,我会推荐如下修改:Copy /Y "$(SolutionDir)Third Party\SomeLibrary\*" "$(TargetDir)" 如果我在我的网站上使用发布,它会复制到部署目录吗? (到目前为止,我认为这在使用发布时不起作用) @codehurn -- 根据您的建议更新。谢谢!【参考方案6】:

存在且不依赖于构建后事件。

将文件添加到您的项目中,然后在 文件 属性中的“复制到输出目录”下选择“始终复制”或“如果更新则复制”。

见MSDN。

【讨论】:

有控制输出子目录的机制吗?我已将foo.exe 放入\Tools\Foo\foo.exe 的解决方案中,并在发布期间将foo.exe 复制到bin\Tools\Foo\foo.exe。第三方代码需要将 foo.exe 直接放到bin 文件夹中。我已经为ToolsFoo 目录关闭了Namespace Provider 属性。但这无济于事。我不想将foo.exe 放在项目根目录中。但是,如果没有任何其他变体,据我所知,这将是唯一的解决方案? 您可以添加解决方案文件夹并将文件添加到其中 - 我相信它将被复制到 bin 目录。 不,遗憾的是,无法控制包含在解决方案文件夹中的文件的构建/发布。我已将foo.exe 包含在项目根目录中。不是很漂亮,但它可以工作:) 谢谢。 VS2015 在这里。如果您将文件放置在 MVC 项目之外(可能在另一个项目中作为解决方案的一部分),则它不会与此一起发布。 sedodream.com/… 帮我解决了这个问题。简短版:将新条目添加到您的 Properties\PublishProfiles\(pubname).pubxml&lt;PropertyGroup&gt;&lt;PipelineCollectFilesPhaseDependsOn&gt;。 (这将仅用于此发布配置文件,而不用于构建或其他发布配置文件!) 在解决方案资源管理器中单击项目,然后单击添加>新建文件夹。将您的文件拖到该文件夹​​中。然后构建>清洁解决方案和构建>重建解决方案。当我构建时,输出现在有一个包含该文件的新文件夹。【参考方案7】:

在解决方案资源管理器中,请选择要复制到输出目录的文件并分配两个属性: - 构建动作 = 内容 - 复制到输出目录 = 始终复制

这样就可以了。

【讨论】:

这仅在项目中引用文件时有效,而不是通过解决方案资源管理器中的“解决方案项”列表在解决方案中引用。 @codechurn 也有办法对解决方案项执行此操作 - 请参阅my answer【参考方案8】:

在我的例子中,将 Copy to Output Directory 设置为 Copy Always 和 Build 并没有解决问题,而 Rebuild 可以。

希望这对某人有所帮助!

【讨论】:

以上是关于VS2010 如何在项目中包含文件,在构建或发布过程中自动将它们复制到构建输出目录的主要内容,如果未能解决你的问题,请参考以下文章

如何不在生成的命名空间中包含 Visual Studio 项目文件夹名称

请教 如何运行含多个cpp的一个c++项目里面的一个cpp

如何在 SharePoint WebPart 中包含 JavaScript 文件?

在 Swift 项目中包含 SQLCipher pod 时如何避免构建错误?

在 C++ 项目中包含 .idl 文件

当我在 settings.gradle 文件中包含项目时,如何不包含构建任务?