我有一个包含许多项目的应用程序。我有时发现我必须删除 dll 并重新编译每个项目,然后才能进行全面的干净编译。我还发现,当我进行构建时,我必须记住检查存储在 bin 文件夹中的每个项目的 dll,编译每个项目,检入 dll,然后运行构建以获得干净的编译。这很麻烦。我只想为我所做的任何更改以及发布时重建一次。那么我该如何解决呢?
3 回答
如果没有更多详细信息,很难确切地知道您需要什么来解决您的特定问题,但这些提示应该会有很大帮助。
当我进行构建时,我必须记住检查存储在 bin 文件夹中的每个项目的 dll
首先,不要将您的 bin 文件夹内容存储在源代码管理中。相反,仅当您需要与他人共享构建时才发布构建,并将其放在源代码控制系统中的不同位置。这是一个可以以这种方式工作的文件夹结构的示例。
-MyProduct --main ----src ----bin << not check in ----etc... -Distribution --MyProject ----release number ------明确发布的dll
在进行整体干净编译之前,我必须删除 dll 并重新编译每个项目。
有时会发生这种情况。在 Visual Studio 中使用重建解决方案命令。
如果您使用文件引用而不是项目引用,则可能导致这种情况更频繁地发生的一个问题。使用项目参考。有关详细信息,请参阅此问题:
如果由于某种原因不能使用项目引用,您可以手动更改解决方案的构建顺序,并设置项目之间的依赖关系以便更好地更新。
我们在我工作的公司遇到了这个问题,我们仍在努力解决它。
我提出的第一个建议是在您的解决方案中不要有对公共库的项目引用。您说您的项目的 bin 文件夹中有一些内部 dll。你需要问自己:
- 这些 dll 是否特定于此解决方案
- 或者,它们是您将再次使用的常用库吗
如果是前者,那么我建议您将该 dll 源作为解决方案中的一个项目。在 Visual Studio 中正确设置构建顺序,重建解决方案将确保一切都得到一个干净的构建。
但是,如果是后者并且您将在其他解决方案中重用这些 dll,那么它们应该在自己的解决方案中。理想情况下使用构建服务器,例如 Cruise Control 或类似的东西。这将允许您对公共库进行更改,并且如果您正确设置它,它将自动使用新版本号重新编译它。然后,一旦你的公共库通过了它的测试并且你很乐意发布它,就将它放入你正在处理的项目中的“bin”或“Dependencies”文件夹中。引用该 dll 而不是上一个示例中的项目。当您构建项目时,它将在编译时使用 bin/Dependencies 文件夹中的 dll。
这样做的好处是,如果您在一个解决方案中使用公共库并将其发布给客户端或作为项目,然后更改公共库并发布新的客户端解决方案/产品,您将确切知道公共库的哪个版本正在使用。然后你可以去你的源代码控制并提取确切的代码。
我们正在使用一些产品,并通过我们实施的每个客户解决方案有效地发展它们。经过十几个项目后,我们不知道每个客户端运行的是什么版本的代码。自从我们迁移到与 Mercurial for SSC 关联的 Cruise Control 之后,我们现在清楚地知道我们所有的产品和客户端解决方案都使用什么版本的代码。
我有时发现我必须删除 dll 并重新编译每个项目,然后才能进行全面的干净编译。
右键单击解决方案 > 清洁解决方案。然后重新构建。这通常会清除奇怪的构建错误。
我还发现,当我进行构建时,我必须记住检查存储在 bin 文件夹中的每个项目的 dll,编译每个项目,检入 dll,然后运行构建以获得干净的编译。
这很可能是真正的问题。不要将外部 dll 直接添加到 bin 中。相反,将任何 3rd 方 dll 添加到解决方案根目录的文件夹中,或者实际上,添加到您可以访问的任何其他位置,但我发现根目录是一个好地方:
- Solution Folder
- ExtLib (place all your 3rd party assemblies here; use sub-folders if needed)
- Project A
- Project B
- MySolution.sln
然后根据需要从您的 ExtLib 添加对每个项目的引用:添加引用 > 浏览:根据需要添加 dll。
添加 dll 后,确保将它们标记为“复制本地”:参考 > 右键单击程序集:复制本地 = True。
如果您需要引用的程序集在相关项目中,则只需添加项目引用即可;无需复制本地,因为 VS 会为您处理。
使用上述内容,您可以将第 3 方程序集保存在您的 ExtLib 文件夹中,并在需要时添加到源代码管理中。然后,每当有人从源代码管理中拉下项目时,他们都会选择 ExtLib 文件夹和任何更新的程序集。无论何时构建,程序集都会从 ExtLib 中引用并复制到 bin。
正如其他人所提到的,永远不要将您的 bin 文件夹添加到源代码管理:YMMV。