这是一篇关于人工智能、前端的技术文章

简介: 这是一篇关于人工智能、前端的技术文章

1

前 言

In the world of software management there exists a dreaded place called “dependency hell.” The bigger your system grows and the more packages you integrate into your software, the more likely you are to find yourself, one day, in this pit of despair.

依赖管理是一个语言必须要解决的问题,而且随着项目依赖的模块量以及复杂程度不断增加会显得更加重要。Go依赖管理发展历史可以归纳如下:

goinstall(2010.02):将依赖的代码库下载到本地,并通过import引用这些库
go get(2011.12):go get代替goinstall
godep(2013.09):godep提供了一个依赖文件,记录所有依赖具体的版本和路径,编译时将依赖下载到workspace中,然后切换到指定版本,并设置GOPATH访问(解决go get没有版本管理的缺陷)
gopkg.in(2014.03):通过import路径中添加版本号来标示不同版本,而实际代码存放于github中,go通过redirect获取代码。例如(import gopkg.in/yaml.v1,实际代码地址为:https://github.com/go-yaml/yaml)
vendor(2015.06);Go 1.5版本引入vendor(类似godep),存放于项目根目录,编译时优先使用vendor目录,之后再去GOPATH,GOROOT目录查找(解决GOPATH无法管控依赖变更和丢失的问题)
dep(2016.08):dep期望统一Go依赖管理,虽然提供了兼容其它依赖管理工具的功能,但是本质上还是利用GOPATH和vendor解决依赖管理
Go Modules(2018.08):Go 1.11发布的官方依赖管理解决方案,并最终统一了Go依赖管理(by Russ Cox)。Go Modules以semantic version(语义版本化)和Minimal Version Selection, MVS(最小版本选择)为核心,相比dep更具稳定性;同时也解决了vendor代码库依赖过于庞大,造成存储浪费的问题
通过如上历史,我们可以看出:Go依赖管理的发展历史,其实就是Go去google的历史(google内部没有强烈的版本管理需求),同时也是典型的社区驱动开发的例子

接下来,我将详细探讨Go Modules的两大核心概念:semantic version(语义化版本)和Minimal Version Selection, MVS(最小版本选择)

2

原 理

●semantic version●

Go使用semantic version来标识package的版本。具体来说:

MAJOR version when you make incompatible API changes(不兼容的修改)
MINOR version when you add functionality in a backwards compatible manner(特性添加,版本兼容)
PATCH version when you make backwards compatible bug fixes(bug修复,版本兼容)

这里,只要模块的主版本号(MAJOR)不变,次版本号(MINOR)以及修订号(PATCH)的变更都不会引起破坏性的变更(breaking change)。这就要求开发人员尽可能按照semantic version发布和管理模块(实际是否遵守以及遵守的程度不能保证,参考Hyrum's Law)

●Minimal Version Selection●

A versioned Go command must decide which module versions to use in each build. I call this list of modules and versions for use in a given build the build list. For stable development, today's build list must also be tomorrow's build list. But then developers must also be allowed to change the build list: to upgrade all modules, to upgrade one module, or to downgrade one module.

The version selection problem therefore is to define the meaning of, and to give algorithms implementing, these four operations on build lists:

Construct the current build list.
Upgrade all modules to their latest versions.
Upgrade one module to a specific newer version.
Downgrade one module to a specific older version.
这里将一次构建(go build)中所依赖模块及其版本列表称为build list,对于一个稳定发展的项目,build list应该尽可能保持不变,同时也允许开发人员修改build list,比如升级或者降级依赖。而依赖管理因此也可以归纳为如下四个操作:

构建项目当前build list
升级所有依赖模块到它们的最新版本
升级某个依赖模块到指定版本
将某个依赖模块降级到指定版本
在Minimal version selection之前,Go的选择算法很简单,且提供了 2 种不同的版本选择算法,但都不正确:

第 1 种算法是 go get 的默认行为:若本地有一个版本,则使用此版本;否则下载使用最新的版本。这种模式将导致使用的版本太老:假设已经安装了B 1.1,并执行 go get 下载,那么go get 不会更新到B 1.2,这样就会导致因为B 1.1太老构建失败或有bug

第 2 种算法是 go get -u 的行为:下载并使用所有模块的最新版本。这种模式可能会因为版本太新而失败:若你运行 go get -u 来下载A依赖模块,会正确地更新到B 1.2。同时也会更新到C 1.3 和E 1.3,但这可能不是 A 想要的,因为这些版本可能未经测试,无法正常工作

这 2 种算法的构建是低保真构建(Low-Fidelity Builds):虽然都想复现模块 A 的作者所使用的构建,但这些构建都因某些不明确的原因而变得有些偏差。在详细介绍最小版本选择算法后,我们将明白为什么最小版本选择算法可以产生高保真的构建:

Minimal version selection assumes that each module declares its own dependency requirements: a list of minimum versions of other modules. Modules are assumed to follow the import compatibility rule—packages in any newer version should work as well as older ones—so a dependency requirement gives only a minimum version, never a maximum version or a list of incompatible later versions.

Then the definitions of the four operations are:

To construct the build list for a given target: start the list with the target itself, and then append each requirement's own build list. If a module appears in the list multiple times, keep only the newest version.
To upgrade all modules to their latest versions: construct the build list, but read each requirement as if it requested the latest module version.
To upgrade one module to a specific newer version: construct the non-upgrad

相关文章
|
2天前
|
机器学习/深度学习 传感器 人工智能
AI与未来医疗:重塑健康管理新格局随着人工智能(AI)技术的飞速发展,医疗行业正迎来一场前所未有的变革。AI不仅在数据分析、诊断支持方面展现出巨大潜力,还在个性化治疗、远程医疗等多个领域实现了突破性进展。本文将探讨AI技术在医疗领域的具体应用及其对未来健康管理的影响。
人工智能(AI)正在彻底改变医疗行业的面貌。通过深度学习算法和大数据分析,AI能够迅速分析海量的医疗数据,提供精准的诊断和治疗建议。此外,AI在远程医疗、药物研发以及患者管理等方面也展现出了巨大的潜力。本文将详细探讨这些技术的应用实例,并展望其对健康管理的深远影响。
|
2天前
|
缓存 人工智能 前端开发
前端技术博客:探索现代前端开发的奥秘
前端技术博客:探索现代前端开发的奥秘
26 11
|
4天前
|
机器学习/深度学习 存储 人工智能
深度学习中的模型压缩技术在人工智能领域,深度学习技术的迅猛发展带来了巨大的计算资源需求。为了解决这一问题,模型压缩技术应运而生。本文将介绍什么是模型压缩、常见的模型压缩方法以及其在实际应用中的意义。
随着深度学习技术的广泛应用,计算资源的需求也大幅增加。为减少资源消耗,提升模型效率,模型压缩技术成为研究热点。本文探讨了模型压缩的定义、主流方法和其重要性。通过量化、剪枝、知识蒸馏和轻量级架构等策略,模型得以在保持性能的同时减小体积,从而适用于资源受限的环境。这些技术不仅降低了计算成本,还推动了深度学习在移动设备和边缘计算等领域的应用,使AI技术更加普及和实用。总之,模型压缩在平衡模型性能与资源消耗之间发挥着关键作用,是未来AI发展的重要方向。
|
9天前
|
机器学习/深度学习 人工智能 监控
人工智能与未来医疗:革命性技术的崛起
人工智能在医疗领域正逐步展现出其巨大的潜力和革命性的影响力。本文将探讨AI在未来医疗中的应用,从诊断到治疗,以及其在医学影像、药物研发和个性化治疗中的作用。通过具体案例,我们揭示这些技术如何提升医疗效率、准确性和患者体验。同时,我们还将讨论AI带来的伦理和隐私挑战,并展望未来的发展方向。
|
12天前
|
机器学习/深度学习 人工智能 物联网
智能家居技术的未来:从自动化到人工智能
本文探讨了智能家居技术的发展趋势,从早期的自动化设备到现在的人工智能集成系统。文章首先介绍了智能家居的基本概念和历史发展,然后详细分析了当前智能家居技术的主要特点,包括物联网、机器学习和用户交互界面。接着,文章讨论了智能家居技术面临的挑战,如隐私保护、数据安全和技术标准化问题。最后,展望了未来智能家居技术的发展方向,包括更加智能化的家居管理、环境自适应能力和高级用户定制服务。文章旨在为读者提供一个关于智能家居技术发展的全面视角,并引发对未来生活方式的思考。
|
20天前
|
人工智能 运维 自然语言处理
AI战略丨构建未来: 生成式人工智能技术落地策略
GenAI 的技术落地需要企业进行周密地规划和持续地努力。企业必须从自身的战略出发, 综合考虑成本、效果和性能,制定合理的技术架构,通过全面的 AI 治理,实现可持续的创新和发展。
|
18天前
|
存储 人工智能 算法
人工智能伦理与治理:在技术进步中寻求平衡
【9月更文挑战第4天】人工智能伦理与治理是一个复杂而重要的议题。在推动AI技术进步的同时,我们必须正视其带来的伦理与治理挑战,并寻求在技术进步中寻求平衡的策略。通过制定伦理准则与标准、加强法律与政策监管、提升算法透明度与可解释性、加强公众教育与参与以及推动国际合作与交流等措施,我们可以构建完善的伦理框架和治理体系,确保AI技术的发展和应用符合道德和社会价值观。
|
11天前
|
人工智能 监控 安全
智能家居技术的未来:从自动化到人工智能
随着科技的飞速发展,智能家居已经从简单的自动化设备进化到了集成人工智能的高级系统。本文将探讨智能家居技术的演变历程、当前的应用实例以及未来的发展趋势,旨在为读者揭示如何通过技术创新实现家居生活的智能化和个性化。我们将从智能家居的基本概念出发,逐步深入到其背后的技术原理,最终展望人工智能如何塑造未来家居生活的可能性。
16 0
|
21天前
|
前端开发 Java Spring
Spring与Angular/React/Vue:当后端大佬遇上前端三杰,会擦出怎样的火花?一场技术的盛宴,你准备好了吗?
【8月更文挑战第31天】Spring框架与Angular、React、Vue等前端框架的集成是现代Web应用开发的核心。通过RESTful API、WebSocket及GraphQL等方式,Spring能与前端框架高效互动,提供快速且功能丰富的应用。RESTful API简单有效,适用于基本数据交互;WebSocket支持实时通信,适合聊天应用和数据监控;GraphQL则提供更精确的数据查询能力。开发者可根据需求选择合适的集成方式,提升用户体验和应用功能。
53 0
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
探索人工智能:从基础理论到实践应用
【8月更文挑战第39天】在本文中,我们将深入探讨人工智能(AI)的基本概念、发展历程以及其在现实世界中的应用。我们将首先介绍AI的定义和主要分类,然后回顾其发展历史,最后通过一个实际的代码示例来展示AI的应用。无论你是AI领域的初学者还是有一定基础的学习者,这篇文章都将为你提供有价值的信息和启示。