代码之家  ›  专栏  ›  技术社区  ›  Kyle West

在解决方案之间共享Visual Studio项目(程序集)的最佳做法是什么

  •  11
  • Kyle West  · 技术社区  · 17 年前

    MyFramework是一个内部产品,没有正式的发布时间表,解决方案也是如此。

    我宁愿不必构建DLL并将其复制到所有12个项目中,也就是说,新开发人员应该能够只做一个简单的工作 svn-checkout ,然后开始工作。

    在所有这些解决方案中共享MyFramework的最佳方式是什么?

    7 回复  |  直到 12 年前
        1
  •  7
  •   M4N    17 年前

    既然你提到SVN,你可以用 externals 将框架项目“导入”到使用它的每个解决方案的工作副本中。这将导致如下布局:

    C:\Projects
      MyFramework
        MyFramework.csproj
        <MyFramework files>
    
      SolutionA
        SolutionA.sln
        ProjectA1
          <ProjectA1 files>
        MyFramework   <-- this is a svn:externals definition to "import" MyFramework
          MyFramework.csproj
          <MyFramework files>
    

    使用此解决方案,您可以在使用MyFramework的每个解决方案中获得MyFramework的源代码。优点是,您可以在每个解决方案中更改MyFramework的源代码(无需切换到其他项目)。

    :同时,这也是一个巨大的缺点,因为在为另一个解决方案修改框架时,很容易破坏某些解决方案的框架。

    出于这个原因,我最近放弃了这种方法,现在将我们的框架项目视为一个完全独立的解决方案/产品(有自己的发布时间表)。然后,所有其他解决方案都包括框架项目二进制文件的特定版本。

    这确保了对框架库所做的更改不会破坏任何重用库的解决方案。对于每个解决方案,我现在可以决定何时更新到更新版本的框架库。

        2
  •  4
  •   Eoin Campbell    17 年前

    听起来像是一场灾难。。。你如何处理开发人员撤销/破坏他人的工作。。。

    您只需构建MyFrameWork(构建后事件可以运行GacUtil将其放入assembly缓存),然后构建另一个项目。

        3
  •  2
  •   John Saunders    17 年前

    “最佳方式”取决于您的环境。我在一个基于TFS的持续集成环境中工作,夜间构建将二进制文件部署到共享中。所有从属项目均指该份额。当速度变慢时,我构建了一些工具,允许开发人员拥有共享二进制文件的本地副本,而无需更改项目文件。

        4
  •  2
  •   Console    17 年前

    12种解决方案中的任何一种都需要定期更改“框架”代码吗?

    由于一个解决方案对框架所做的更改将影响所有其他解决方案,因此会出现中断,您必须处理这些中断。

    一旦您在解决方案中工作时很少需要更改框架(这应该是您的目标),那么我将包含对框架dll的引用,并仅在需要时更新每个解决方案中的dll。

        5
  •  2
  •   Wim Coenen    17 年前

    svn:externals 如果你遵守一些规则,你会很好地处理这个问题。

    首先,如果对svn:externals定义使用相对URI(以^character开头),并尽可能将项目放在同一个存储库中,则更安全。这样,即使subversion服务器被移动到新的URL,这些定义也将保持有效。

    使用 你的外部定义 . 这样做 下拉一个不同的快照 外部信息,准确地说 避免意外得到 你可能无法控制 也就是说,当你回溯你的 回到他们穿那件衣服的样子 以前的版本。。。

        6
  •  1
  •   GEOCHET S.Lott    17 年前

    1. 将二进制文件保存在repo中(这不是一个好主意)。即使在这种情况下,依赖项目也必须执行get,并且必须知道要获取的版本。

    您可以做的是为依赖项创建一个发布包,将path env变量设置为自身。我会允许机器上存在多个版本,然后依赖项目链接/引用特定版本。

    差不多

    $(PROJ_A_ROOT) = c:\mystuff\libraryA
    
    $(PROJ_A_VER_X) = %PROJ_A_ROOT%\VER_X
    

    虽然不漂亮,但很管用。

        7
  •  1
  •   Rok StrniÅ¡a    12 年前

    svn-external 以便导入的项目与其他项目平行。原因如下。

    externals ,通过svn external似乎是一个好主意,直到您在项目之间具有非平凡的依赖关系。

    # BAD SOLUTION #
    S
    +---S.sln
    +---A
    |   \---A.csproj
    \---externals
        +---B     <--- A's dependency
        |   \---B.csproj
        \---externals
            \---C     <--- B's dependency
                \---C.csproj
    

    您甚至可能在树中拥有单个项目的多个副本 . 这显然不是你想要的。

    此外,如果您的项目使用 NuGet packages NuGet中项目的引用 外部 子目录将被破坏 .

    此外,如果您使用 Git git submodule Git submodule命令将生成一个直接子目录的克隆 .

    将所有项目放在同一层上的另一个好处是,您可以创建一个“超级解决方案”,其中包含来自所有解决方案的项目(通过Git或svn external跟踪),从而允许您 .

    # GOOD SOLUTION #
    S
    +---S.sln
    +---A
    |   \---A.csproj
    +---B     <--- A's dependency
    |   \---B.csproj
    \---C     <--- B's dependency
        \---C.csproj