sixufei

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

NugetServer搭建

公共库可能大家都不陌生,每家公司都会有自己通用的加解密方法。通用sso的字段、各大组件封装之后稳定的方法也都在里面。公共库的强大有时候可以看成项目的成熟度,因为很多dll文件都是提炼重构以前冗余代码的结果。好,我们现在有40几个dll文件库。久而久之,公共库的管理问题出现了一些问题,带给项目在开发测试上线的时候引来了一些麻烦和安全隐患:

①、公共库文件升级造成各站点dll文件版本不一致

底层的方法基本不会变动,但是时间一长,例如发现站点会被一些没有带useragent的http请求访问到,导致底层方法会有一些Exception没有被catch(举例说明,这种情况极小出现),或者外部组件升级,提供了一些新的方法,需要在公共库中把部分功能重写或者优化,或者业务变更,导致需要在通用组件中扩展新的字段等等。公共库尽量做到不变,但是实际情况可能不到半年或者更短就要修改。

这个时候引发的问题,正如标题所说,升级了公共库,很多时候小的项目组总是口头上说说,各个站点开发人员也多时候也忘记了,直接导致部分站点公共库文件版本不一致。而且站点一旦多起来,完全没办法管理。这时候就有安全隐患了,例如新业务功能上线,需要使用新的公共库,但是线上的版本并没有升级。如果签名一致,只是实现不一样,测试上线人员也没有办法发现。

②、公共库版本升级费力又容易错

以前都是人为升级,很多时候,公共库只是换了一个路径,这个时候就要修改引用路径,如果从.net framework 4.0升级到4.5,这个时候文件夹路径又怎么表示出来了,各个分开的应用程序如何得知自己的公共库有新的版本出来了。而且公共库引用一旦多起来,一个solution又有多个project在引用公共库,又容易错,又耗时间。

③、新项目引用公共库的问题

这个时候又来了一个新的项目要做,全新的solution,需要引用公共库了,头痛的事情来了,到底哪个是新的,哪个是旧的,每一个版本有什么样的功能。


上面这些问题很容易在小IT公司出现,至少本公司已经出现过很多次了,如何解决这个问题,我们发现解决上面三个问题需要做以下几件事情:

  • 动态感知公共库是否最新有变动
  • 公共库升级复杂的问题要解决
  • 需要显示公共库版本升级的内容

没错,这时候要引入一个很老的工具:Nuget,下面带大家创建自己的MyNugetServer

以下是在windows10,visual studio 2013,nuget版本:2.8.50313.46下操作的,如有失败,恕不搭理 主要分以下几个步骤:

  • 创建,发布MyNugetServer服务器
  • 创建,发布自己的Core包
  • 在新项目中使用Core包
  • 升级Core包,并在引用的项目中升级

1、创建,发布MyNugetServer服务器

开始讲重点,先创建一个Web空的应用程序,叫做MyNugetServer

然后就创建好一个web空的应用程序,如图所示:

然后为本项目加入nuget.server的库文件,打开方法,如下所示:

在命令行中输入:Install-Package nuget.server

如果提示失败,是因为nuget.server截止201705的最新版适用于.net framework4.6,考虑升级站点的framework版本,或者考虑装早期的版本。装好之后,发现站点里面已经有几个文件,如图 所示

然后把站点发布到自己的iis下面,我选择的是C:\Website\myNuget,站点名称是:http://mynuget.com:8082,由于本机的80端口被Apache占领,不知道怎么不用端口访问,但是这不重要。

 

本处设置了自己的host,也可以用ip来表示。

打开访问

这个时候站点已经搭建好了。

2、创建,发布自己的Core包

站点搭建好了,如果准备自己的包呢,我们新建一个项目(Project),名字叫做com.jeffrey.Core,还在刚才的解决方案(solution)下面。添加一个方法叫做:MathHelper.cs文件,里面的代码如下:

 public class MathHelper
 {
    /// <summary>
    /// 加法
    /// </summary>
    /// <param name="firstNumber"></param>
    /// <param name="secondNumber"></param>
    /// <returns></returns>
    public int AddResult(int firstNumber, int secondNumber)
    {   
        int result = firstNumber + secondNumber;
        return result;
    }
 }

很简单的方法,应该没有啥问题。 现在我要把这个release出来的dll文件放到我的mynuget服务器上面去,怎么放。这个时候就需要一个官方提供的工具,叫做:NuGetPackageExplorer,下载路径 安装好了,我们开始创建自己的nuget包。 开发软件,点击【create a new package】

 

拖入我们编译出来的dll包,然后修改左边的metadata,如下所示:

修改id,version默认1.0.0,加入description,然后保存metadata。可以在里面设置依赖项等等。 上面点击file->saveas,保存在桌面上面。会形成这样的一个文件:【Com.Jeffrey.Core.1.0.0.nupkg】,里面包含dll文件所有的东西,然后我们把这个文件放到我们刚才建的站点的packages中,目录:C:\Website\myNuget\Packages。然后点击刚才的站点[http://mynuget.com:8082/nuget/Packages]中的 [Click here to view your packages.]中的here,你会发现多了一个dll文件的描述信息了,这个时候专属的dll包已经发布到专属的mynuget服务器上面了。如果你想发布到官网,让更多的人使用,可以再nuget官网注册一个账号,然后会给你一个apikey,你就可以发布到官网上,让别人看到你的文件了。

到这里创建发布自己的core包已经实现。

3、在新项目中使用Core包

我们新建一个解决方案,叫做MyWebSiteUseNuget,是一个web空的应用程序,只是为了演示。 点击程序包管理器设置,如下所示:

点击程序包源,添加一个新的nuget源。修改名称和源,源就是刚才创建那个网站,这里是:http://mynuget.com:8082/nuget(下面的截图有问题,记住后面nuget不要漏掉),记住点击更新保存。这个时候就能在新的解决方案中看到自己的发布的包了,然后点击安装,就可以了,这个时候发现项目文件中有一个package文件,里面记录了自己通过nuget拉取到的信息。

添加一个简单的方法,看看调用有没有问题。

Code:

 public class Bank
{
    private int myMoney;//当前账户中的钱

    /// <summary>
    /// 构造函数,初始化账户信息
    /// </summary>
    /// <param name="account"></param>
    public Bank(long account)
    {
        myMoney = GetMyMoney();
    }

    /// <summary>
    /// 只是一个demo,不考虑多线程的数据污染的问题
    /// </summary>
    /// <param name="Number"></param>
    public void StoreMoney(int Number)
    {
        MathHelper helper = new MathHelper();
        myMoney = helper.AddResult(myMoney, Number);
    }

    /// <summary>
    /// 返回当前账户中的钱
    /// </summary>
    /// <returns></returns>
    private int GetMyMoney()
    {
        return new Random().Next(1000, 20000);
    }
}

  

此时方法已经可以调用了,此环节结束。

4、升级Core包,并在引用的项目中升级

好,现在我们发现一个问题,对于我们的jeffreycore中的代码,如果你存的钱特别的多,可能会导致int溢出,那这个方法不就不可靠了吗?我们做简单判断,抛出异常。如下所示:

代码:

  /// <summary>
    /// 加法
    /// </summary>
    /// <param name="firstNumber"></param>
    /// <param name="secondNumber"></param>
    /// <returns></returns>
    public int AddResult(int firstNumber, int secondNumber)
    {
        //demo,只做正溢出判断
        if (secondNumber > int.MaxValue - firstNumber) 
        {
            throw new OverflowException("ErrorCode:3301");
        }

        int result = firstNumber + secondNumber;
        return result;
    }

  

然后重新发布core文件,升级类库的基础版本,为1.1.0.0,修改nugetpackageexplorer中的version版本为1.1.0,加入新的description,重新save,这个时候应该会看到文件的名称是:Com.Jeffrey.Core.1.1.0.nupkg。按照上面的步骤,重新丢到mynugetserver中。这个时候发现packages中出现两个文件夹了

我们这个时候在去引用自己类库的方法中看一下是不是有新版本升级提示。重新编译原来的项目,发现并没有。我们再看看是否可以再【管理解决方案的Nuget程序包】中查看是否有新的版本,发现已经有了。点击安装。发现原来的解决方案中的packages.config从

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Com.Jeffrey.Core" version="1.0.0" targetFramework="net461" />
</packages>

变成了

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Com.Jeffrey.Core" version="1.1.0" targetFramework="net461" />
</packages>


讲到这边,已经结束。 回头我们在看我们最开始提出来的问题,是不是都解决了。关于公共库svn和站点管理,尽量和开发主干一样,越少人维护越好,尽量由项目经理或者架构师维护,这块比较重要。

posted on 2017-05-03 06:14  sixufei  阅读(282)  评论(0)    收藏  举报