跨项目代码共享(C#)

A:你把xx项目的xx代码发我一份吧,我这边也有那个功能
B:好的。(ctrl+c、ctrl+v 甩过去)


A:我这边的逻辑怎么和你不一样?你那边是不是偷偷修改了什么
B:艹,我怎么知道你那么也有这个逻辑。。。
A:怪我咯???

类似这些情况目前在开发团队中或多或少总会存在,开发过程中对于copy代码这件事,可能苦于目前工作量大,开发交付时间紧张,选择一个目前认为高效的方式,不copy能怎样呢?心里当然是知道肯定存在解决方案的。

我们解决问题的方式是搭建自己的 Nuget Server

通过 Nuget Server的方式可以帮助我们进行代码统一管理,功能变化的代码版本控制,Server端版本升级时对引用方目前使用的版本进行兼容即可。每个项目公共功能的代码使用只需要一键安装就来了。如果Server端版本升了,引用方根据项目本身的需要,看是否需要升级到新版本。

  1. 创建一个项目,用来管理通过 Nuget Server 发布的代码,代码本身通过github管理,理论上每次发布新版本Nuget包都有一个分支代码和该版本对应;

  2. 创建类库,我们使用场景是需要同时支持 .Net Framework和 .Net Core 项目的使用(.Net Framework 4.5.2及以上可以使用,.Net Standard 1.5及以上可以使用),而且希望功能性相关代码只维护一份

    • 尝试1:使用可移植类库来实现,经过一系列的测试,失败了;
    • 尝试2:使用standard类库来实现,经过一系列的测试,依然失败;
    • 尝试3:

      • 创建两个类库,一个基于.Net Framework 4.5.2,一个基于.Net Standard 1.5;

        lib.png

      • 把.Net Standard 1.5的类库中的.csproj 文件复制到.Net Framework 4.5.2的类库中,创建一个与.Net Framework 4.5.2中的.csproj同名的.project.json,彻底删除上一步中创建的Net Standard 1.5类库;

        structure.png

      • project.json 内容如下:

        1
        2
        3
        4
        5
        {
        "frameworks": {"net452": { } },
        "runtimes": {"win": {}},
        "dependencies": {} //根据这个类库的依赖项决定
        }
      • 添加现有项目(位于.Net Framework 4.5.2的类库下的Netstandard1.5.csproj),移除Netstandard1.5类库无效依赖,最终就达到了两个类库服用一份代码;

      • Build的时候还是会失败的,Properties/AssemblyInfo.cs 对于Netstandard1.5类库来说是没用的,所以把这个文件的生成操作设置成 “无”;

      • 重新Build,成功了。

  3. 编写功能性代码。在任何一个类库中写都可以,因为本质是一份代码,从哪个类库看都是一样的。完成后自己先做好测试;

  4. 在Release模式下Build(build的时候最好把两个类库的程序集名称和默认命名空间都修改成一致,还需要设置生成xml文件,xml文件内包含所有代码的注释,方便调用者使用);

  5. 将类库中Release文件夹中的dll和xml拖拽到 NuGet Package Manager 的内容区域,需按规定的目录格式,如果当前Package有依赖其他Package,则需要Edit dependencies

    release.png

    package.png

  6. 发布到本地 Nuget Server,Publish Url只要内网之间可以访问就行;

    publish.png

  7. 引用方在vs中配置本地的 Nuget 源,然后就可以安装/升级/卸载 Nuget Server上的包了。

参考链接:

如果对你有帮助就好