繁体   English   中英

Visual Studio:如何管理项目之间共享的代码

[英]Visual Studio : How to manage code shared between projects

这可能之前已经发布过,但我不确定要查找什么搜索词!

快速解释。

我有几个项目之间共享的代码。 此代码本身仍在进行中。 问题是,每当我需要更新此代码时,我都不想这样做 3 次,这将成为一场噩梦。

有没有办法将它添加到项目中,而无需将其复制到项目文件夹中? 即我希望共享类链接到我的 3 个项目中

C:\\code repository\\sharedclass.cs 不是 \\eachproject\\bin\\sharedclass.cs

我必须将它创建为它自己的库项目吗? 如果编译器可以将其编译为“外部”代码,那就更好了。

干杯。

正如其他人所说,您只需在解决方案资源管理器中右键单击您的解决方案,选择添加 > 现有项目,然后浏览到公共项目的 .csproj 文件,它将从其原始位置包含在解决方案中。

但是,这有两个问题,这可能是也可能不是问题,具体取决于您的团队规模:

  1. 公共项目将包含在每个解决方案中,并带有解决方案文件的相对路径(即:...\\CommonProject\\Common.csproj)。 这意味着所有开发人员都必须具有相同的工作文件结构,否则在尝试打开主项目时会出错。

  2. 在公共项目被多个项目(例如两个 - A 和 B)引用并且在项目 A 上工作的开发人员必须对公共项目进行更改作为其任务的一部分的情况下,该开发人员无法知道如果他们所做的更改会破坏项目 B,而无需他们实际检查项目 B 并对其进行编译。 随着越来越多的项目引用公共项目,发生这种情况的风险增加到无法管理的程度。

同样,正如其他人所说,没有“正确”的方法可以做到这一点。 但是,我采取的方法如下:

  1. 使用 Cruise Control 等持续集成来管理项目的构建,并将公共项目作为独立项目放在服务器上。

  2. 在您的源代码控制下创建一个目录来存放构建的通用 DLL。 在您的构建机器上签出此目录,并且无论何时构建公共项目,它都会将输出 DLL 复制到 DLL 文件夹中,并将这些更改提交给源代码管理。

  3. 在所有开发人员的机器和构建服务器上使用环境变量来控制公共 DLL 文件夹的位置,并使用该变量而不是硬编码路径来引用 DLL。 (即:而不是 C:\\Source\\MyCommonProjectDLLS\\Common.dll,使用 $(MyCommonLocation)\\Common.dll 并将变量“MyCommonLocation”设置为 C:\\Source\\MyCommonProjectDLLS)

  4. 对于引用公共 DLL 的任何项目,请在构建服务器上为该项目设置 CI 触发器以查看公共 DLL 文件夹。 每当向其提交更改时,构建服务器应构建所有使用的项目。

这会立即让您知道您是否正在为任何其他项目提交重大更改。 唯一的缺点是,在此模型中,消费项目在生成后就被迫更新公共 DLL。 另一种方法是在构建时从源控制修订版中对通用 DLL 进行版本控制,并将每个版本放在通用 DLL 文件夹下的自己的子目录中。 所以你最终会得到:

常见的 DLL
-1.0.0.1234
-1.0.0.1235
-1.0.0.1236

等等。 这样做的好处是,每个项目都可以通过简单地引用新版本的代码来选择何时对公共 DLL 进行更新。 然而,它是双向的,因为这可能意味着某些项目保留旧版本的公共代码的时间比它们应有的时间长,这可能会增加最终引入这些更改时所涉及的工作。

是的。

您可以将硬盘上任何位置的项目添加到解决方案中。 因此,将共享代码放入类库并将其添加到您的三个项目中。

Microsoft 一直在支持一个现在内置于 VS 中的开源项目,称为 NuGet,您可以将共享项目输出为 nuget 文件并在其他项目中使用它。

它实际上会在构建时部署您在包中指定的所有文件。

这就是 .Net 现在支持依赖项的方式。 您会注意到,即使是像 EF 这样的东西也是通过 NuGet 包实现的。 您甚至可以在 MyGet.org 之类的地方免费托管它,我使用它并且效果很好。

http://nuget.org/

我使用git 子模块来实现这一点。

  1. 为要在解决方案之间共享的每个模块(项目)创建一个新的 git 存储库。 我通常还在一个单独的项目中包含该项目的单元测试,但在同一个 git 存储库中。
  2. 子模块添加到将使用共享代码的解决方案的 git 存储库。 添加子模块会创建指向外部存储库特定提交的链接。 当子模块中的代码更新时,您将能够将更新拉到父解决方案中,这与更新对子模块提交的引用基本相同。 我发现使用像SourceTree这样的应用程序更容易可视化这个过程。
  3. 添加子模块并拉取最新提交将在父解决方案文件夹中创建共享项目的副本。 通过右键单击解决方案并选择“添加现有项目”,将项目导入到父 Visual Studio 解决方案中。
  4. 通过右键单击项目并选择“添加引用”并在“解决方案”选项卡中找到共享项目,在将使用它的其他项目中添加对共享项目的引用。

现在共享项目已包含在解决方案中,您将能够向子模块推送和拉取更改,这些更改将自动合并到解决方案中。 您还可以看到引用子模块的其他 git 存储库中的更改。

是的,将需要共享的代码放在一个单独的类库项目中,构建它并将由此构建创建的 DLL 引用到您的其他项目中。

最好将公共部分提取到单独的项目库中,并将该项目的引用添加到所有解决方案/依赖项目中。

否则,您可以将代码/文件/项目添加为链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM