【问题标题】:Place all output dlls in common directory from Visual Studio将所有输出 dll 放在 Visual Studio 的公共目录中
【发布时间】:2011-03-18 20:48:06
【问题描述】:

我有几个不同的解决方案,其中一些项目可能依赖于其他解决方案中项目的输出。为了解决这个问题,我一直在构建后将每个项目中 /bin/ 文件夹中的 dll 文件复制到共享库位置,然后将它们从那里复制/引用到依赖项目。

但是,随着库解决方案变得越来越大,这往往变得无法维护。我花了太多时间在 Windows 资源管理器中遍历解决方案目录以查找 /bin/ 文件夹,并试图从我需要的每个 dll 文件中找出哪个或哪些 dll 文件。

有没有什么方法可以提示 Visual Studio 我希望解决方案中的所有项目具有相同的输出目录?例如,直接在解决方案文件夹下的 /bin/ 文件夹,所有项目将其输出放置在其中。

如果可能,我希望在没有复制文件的硬编码构建后事件的情况下实现这一点,因为如果项目输出更改文件名或添加另一个文件,这将失败。我宁愿更改实际输出目录的位置 - $(OutDir) 的位置,如果您愿意的话。

【问题讨论】:

    标签: visual-studio-2010 msbuild projects-and-solutions output-directory


    【解决方案1】:

    我知道您说过您不想使用构建后事件,但您的原因引起了我的兴趣。听起来您可能在构建后事件中对 .dll 的名称进行了硬编码。这很容易避免。

    xcopy "$(TargetDir)*" "c:\common\" /Y

    * 只会导致您的 bin/Debug/ 文件夹中的 所有内容 被复制到您的公用文件夹中。如果需要,您也可以只复制 dll。或者,如果您使用 $(TargetPath),您将只复制作为项目结果的 1 个 dll,而不是任何其他相关依赖项。

    更新

    我们这样做的方式是将每个项目的整个 bin 文件夹复制到一个 sub 文件夹中。假设您有 2 个项目,WebUtilHtmlParser,其中 WebUtil 依赖于 HtmlParser。对于这两个项目,请使用xcopy "$(TargetDir)*" "c:\common\$(ProjectName)" /Y。这将创建 c:\common\WebUtil\ 和 c:\common\HtmlParser。在 WebUtil 中,添加对 c:\common\HtmlParser\HtmlParser.dll 的引用。现在在 c:\common 中有 2 个 HtmlParser.dll 副本。

    c:\common\HtmlParser\HtmlParser.dll // 最近的构建。 c:\common\WebUtil\HtmlParser // 当 WebUtil 被构建时 最近的构建

    这有各种优点。如果您更改 HtmlParser 的 API,WebUtil 将继续工作,因为在您尝试重新构建 WebUtil 之前,它将具有较旧的 HtmlParser.dll(此时您会因为更改的 API 而遇到构建错误)。

    现在,如果第三个项目依赖于 WebUtil,并且您正在使用 WebUtil 的某些部分在 HtmlParser 中公开类,那么您需要添加对 both的引用> 新项目中的项目。添加对 HtmlParser.dll 的引用时,请使用 c:\common\WebUtil 中的引用。您这样做是因为您只是将它作为 WebUtil 的必要要求包括在内。现在,您将始终拥有与当前 WebUtil.dll 版本相匹配的 HtmlParser.dll 版本。

    我希望这是有道理的。管理这绝对是一件棘手的事情。等到你必须开始使用 svn:externals =P

    拉下所有依赖项

    【讨论】:

    • 这仍然给我留下了两个问题之一:要么(如果我从 bin 复制所有内容)我冒着复制太多并覆盖其他项目的东西的风险,或者(如果我只复制作为项目的结果)我冒着在 builds 文件夹中得到太少的风险,因为可能会忽略所需的依赖项。没有中路吗?
    • +1 这正是我所建议的。 @Tomas,您是否意识到您可以更仔细地过滤副本:xcopy "$(TargetDir)*.dll" "c:\common\" /Y 仅复制 dll。如果这不能完全得到所有内容,那么您也可以添加另一个更具体的复制命令。这真的不是什么麻烦事,只需要几分钟的工作时间和一两个测试版本,如果您对xcopy 应用正确的过滤,那么它的维护成本也很低。
    • @Tomas - 您可以改用 Robocopy 并使用排除/包含选项来解决这些情况。
    【解决方案2】:

    您可以在每个项目属性中设置输出目录。

    右键项目,选择Properties

    对于 C#,它是 Build 属性页之一,位于 OutputOutput directory 下。

    在 VB.Net 项目中,它位于顶部文本框中的 Compile 选项卡上。

    【讨论】:

    • 我的项目主要是 VB.NET 项目,所以属性页看起来与 C# 项目不同。
    • 还是找到了 =) 但是,这是在项目级别上。如果两个项目依赖于同一个第三方项目或第三方 dll,会发生什么情况——它们会覆盖、重命名或寻求帮助(即抛出异常)?我所追求的是 - 有没有办法在解决方案级别而不是项目级别上做到这一点?
    • @Thomas - 是的,在项目级别。不会抛出异常,通常依赖的 dll 将被覆盖。这不是问题,因为项目的编译是按顺序进行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多