为什么在Azure DevOps提交时,Visual Studio会排除BIN和OBJ文件夹?

6
我想知道如何从Visual Studio或Git-Bash将在Visual Studio中编写的代码提交到Azure DevOps的通用方法。问题是bin文件夹包含许多第三方dll,这些dll在构建项目之前会被保存在源代码中。这些第三方dll对于项目是必要的。但是在提交到Azure DevOps后,bin和obj文件夹不存在了。这是由于.gitignore和.gitattribute文件导致的。我已经删除了这两个文件并暂时提交了bin文件夹。这两个文件的目的是什么?请问有人能够建议一种解决方法吗? exclude - 图片名为exclude
5个回答

5

.gitignore 文件指定未跟踪的文件。 .gitattributes 根据路径定义属性。 它们是Git的配置文件。

在Visual Studio中,bin和obj文件夹用于存储编译器生成的输出(请参见此处)。由于这些输出文件是由编译器生成的,因此您不希望在源控件中跟踪它们。

如果您的项目需要引用一些第三方dll,则最好的方法是引用它们作为Nuget包,如果这些dll有Nuget包可用。 如果没有,您可以将它们放在bin或obj之外的文件夹中,以便在Git中跟踪它们。 您不应更改 .gitignore 文件来跟踪 bin 或 obj 文件夹。


4

.gitignore旨在从源代码控制中排除内容。例如,如果您有一个包含您的数据库连接字符串的文件在您的开发文件夹中,您不希望您的密码被检查到源代码控制中。将二进制文件检入存储库是一种不良做法。您应该使用依赖管理系统(如Nuget,Chocolately,Maven,npm等)来指定依赖项并下载它们。现在您正在执行的方式是将它们的多个副本检入多个项目中,而不能在一个地方进行管理。合适的依赖管理很可能是为什么默认版本的.gitignore会排除某些文件夹的原因。您还需要重新生成obj文件夹的所有内容。如果您有旧副本的时间戳会变得奇怪。每次进行纯净构建都意味着从没有编译过的artifact的新副本开始。


4
作为大多数人已经提供了很好的答案。我将为您提供一些处理第三方DLL(程序集)的想法。
请记住,使用第三方库的理想/最佳方式是通过NuGet Feed / Packages
对于某些情况,这些DLL可能不会在Nuget.org中提供。在这种情况下,您可以按照以下步骤将引用添加到项目中。
1. 在项目中创建一个名为lib的文件夹

enter image description here

  1. 将DLL添加到该文件夹中

enter image description here

  1. 右键单击 DLL,选择“属性”,然后将“BuildAction”更改为“无”、“Copy to Output Directory”更改为“不复制”

enter image description here

  1. 最后,从lib文件夹中添加引用

enter image description here

当您将项目检入任何版本控制时,lib文件夹也会被检入,在构建期间,引用也会从lib文件夹中获取。
请记住,不要使用bin/obj文件夹来引用您的DLL,并且永远不要检入bin和Obj文件夹。因为这些文件夹将在构建过程中自动生成。

3
为了进一步强调:即使您确实想要检查 bin 文件夹(正如其他人所提到的,您不应该这样做),也不要通过删除 .gitignore.gitattributes 文件来实现。 .gitignore 包含一个文件列表,这些文件不应被添加到您的存储库中。 这些是不应与团队分享的文件,例如本地配置数据。 如果您提交了 .vs 目录中的 SQLite 数据,则会出现无数冲突,并且由于 Visual Studio 已锁定该文件,因此无法进行拉取操作。 .gitattributes 包含一组配置,特别是针对行结尾符号的设置。 所有开发人员必须同意设置才能在存储库中存在,否则将因空格导致冲突。
如果您真的必须(而您不应该)检查文件到您的 bin 目录中,请恢复您的 .gitignore.gitattributes 文件。 然后,使用否定模式在 .gitignore 中显式列出它们: !bin/foo.dll 但是 - 如其他人所评论的那样 - 这仍然是个坏主意。

1
bin文件夹绝对不是存储第三方dll的正确位置。将它们存储在其他地方,并在构建期间将其复制到bin文件夹中,或者如果可用,则使用NuGet软件包。 将bin文件夹排除在源代码控制之外是一种广泛使用的标准流程。 此外,如果您决定清理解决方案,则bin文件夹将被清空,您的第三方dll将消失。
另一个要点,由于您发布了一个带有azure-devops标签的问题,azure-devops提供了强大的构建和测试管道。这意味着您可以检查代码,托管的构建服务器(标准情况下,如果您设置了这样的方式)将从源代码控制中拉取您的代码并进行构建、运行一些测试,如果一切正常,则压缩您的二进制文件并将它们放在您可以下载的某个位置。现在,您已经在bin中检查了自己的dll,它们会在服务器构建代码时被覆盖。那么,为什么要首先检查它们?如果服务器执行清理(它不一定会这样做),那么您的第三方dll将会丢失。

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