【问题标题】:Can I disable the generation of obj in the same directory for _every_ project I have?我可以为我拥有的 _every_ 项目在同一目录中禁用 obj 的生成吗?
【发布时间】:2011-11-30 20:42:02
【问题描述】:

我正在整理我的项目。我找到了通过添加删除对象文件夹的方法: %TEMP%

在我的项目中。但我想以某种方式进行此全局设置或在构建后自动删除我的 obj 目录。有没有办法做到这一点?

【问题讨论】:

  • 为什么要删除对象文件夹?
  • 因为在创建二进制文件后不需要它们。归档时,这些是不需要的兆字节。

标签: c# .net visual-studio macros


【解决方案1】:

我个人喜欢在我的项目中有一个特定的Output 文件夹,我将所有已编译的文件放在其中。

我在构建后事件中有以下命令行。

copy "$(TargetPath)" "$(SolutionDir)\Output\$(TargetFileName)"

这会将编译后的文件复制到解决方案内的输出目录。您需要将此添加到解决方案中的所有项目中。

如果您有任何依赖项也需要复制,您也可以添加类似的内容。

copy "$(ProjectDir)Dependencies\Language.xml" "$(SolutionDir)\Output\Extensions\Language.xml"

[编辑]

您可以尝试以下方法先复制文件,然后在完成后删除对象文件夹。

copy "$(TargetPath)" "$(SolutionDir)\Output\$(TargetFileName)"
rd /s /q "$(ProjectDir)\obj"

[EDIT2] 更新了屏幕截图以进行说明。 :)

这是我的对象文件夹在编译项目后通常的样子。

这是使用上述命令编译后的样子。如您所见,Visual Studio 在事件发生后重新创建了该文件夹,但该文件夹为空。

您可能需要仔细检查您是否正在使用提升的权限运行 Visual Studio。为此,只需右键单击 Visual Studio 并选择 "Run as Administrator"

【讨论】:

  • 这很有趣,但是当您使用 .dll 和其他文件时,您也必须复制它们。我也想摆脱 obj。
  • 您可能只需添加一个脚本,在复制所需文件后以类似方式删除所有文件。例如,您可以看一下这个,只需将其更改为 *.obj:stackoverflow.com/questions/768282/…
  • 我试过:rd /s /q "$(SolutionDir)obj",但它没有删除 obj 文件夹。
  • 我也更新了删除 obj 文件夹的命令。它仍会重新创建,但应该是空的。
  • 不会删除obj文件夹。
【解决方案2】:

您是否使用源代码管理?
这条评论听起来像你没有:

归档时,这些是不需要的兆字节。

(“存档”听起来有点像定期将整个项目文件夹复制到backup_yyyymmdd之类的东西)

如果您不使用源代码管理,则应明确考虑开始使用它。

除了一般优势(例如,具有日期和 cmets 的更改历史......)之外,它还为您的 obj 文件夹问题提供了一个开箱即用的解决方案:

所有优秀的源代码控制软件都支持忽略您可以定义的某些文件或文件夹(忽略意味着:它们永远无法提交到源存储库,您甚至不会在更改的文件列表中看到它们,甚至当它们改变时)。

例如,在Mercurial(我使用)中,忽略设置保存在主文件夹中名为.hgignore 的文件中(Git 也一样,只是称为.gitignore)。

我所有 Visual Studio 项目的默认 .hgignore 文件如下所示:

syntax: glob
bin
obj
*.suo
*.user

第一行属于 Mercurial 的忽略语法,其余为忽略的设置。
可以看到binobj 文件夹被忽略了……无论在哪个子文件夹中都被忽略了!

所以我不必关心 obj 文件夹的实际位置,也不必在每次构建解决方案时手动删除它们。它们在我的源代码管理历史中根本不存在。


另外,关于将所有内容放在一个输出文件夹中,我对 Fuji 的回答有所不同:

我也喜欢这样做,但我更喜欢在 Visual Studio 的项目设置中更改输出文件夹,而不是使用构建后事件。

默认输出文件夹为:

  • bin\Debug\
  • bin\Release\

我把它们改成:

  • ..\build\Debug\
  • ..\build\Release\

这会将所有内容编译到 build 文件夹的子文件夹中,该文件夹与 .sln 文件处于同一级别(这意味着:解决方案中的所有项目都直接编译到同一文件夹中)。
它还减少了编译时间,因为 Visual Studio 不必在编译后复制所有依赖项(因为所有内容都已经在同一个文件夹中)。

(我这样做主要是因为编译时间,因为如上所述我忽略了 Mercurial 中的 bin obj 文件夹,所以我不在乎它们实际上在哪里)

【讨论】:

  • 我对源代码控制有相同的想法,但不确定,因为他从未回答我的最后一个问题。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多