精华内容
下载资源
问答
  • Swift 包管理器教程

    千次阅读 2017-05-05 09:00:09
    Swift 包管理器的正式发布是随着 Swift3.0 一起发布的,它是一个用于构建能够运行在 macOS 和 Linux 上的 Swift 库和 app 的新方法。它能够帮助你管理依赖,让你轻松构建、测试和运行你的 Swift 代码。

    原文:An Introduction to the Swift Package Manager
    作者: Mikael Konutgan
    译者:kmyhy

    Swift 包管理器的正式发布是随着 Swift3.0 一起发布的,它是一个用于构建能够运行在 macOS 和 Linux 上的 Swift 库和 app 的新方法。它能够帮助你管理依赖,让你轻松构建、测试和运行你的 Swift 代码。

    Swift 包管理器有助于极大地改进 Swift 生态系统,让 Swift 更容易使用、部署到没有 Xcode 的平台上,比如 Linux。Swift 包管理器还能解决在使用多个相互依赖的库时的“依赖地狱”的问题。

    重要的一点是,因为 Swift 3 的原因,Swift 包管理器只能在 host 平台上编译。换句话说,你无法编译、使用 iOS、watchOS 和 tvOS 上的包。

    让我们开始吧!

    开始

    在开始之前,确认你已经安装了 Swift 3.0 以上。Swift 3 内置在 Xcode8+,因此如果你已经安装了 Xcode8 或以上,你就可以开始本教程。当然实际上你并不需要用 Xcode 去完成本教程,你可以直接从 swift.org 下载安装 Swift 3。

    打开终端窗口,输入 swift package。你会看到这个命令的介绍。你将使用这几个命令:

    1. swift package init ,创建新包
    2. swift package update ,更新一个包的依赖
    3. swift package generate-xcodeproj ,为包生成 Xcode 项目

    要学习 Swift 包管理器,我们将编写一个命令行 app,用一个库打印出所有国家的国旗字符。首先我们会创建一个可执行包。这种包也就是命令行 app。Swift web app 也属于这种类别。

    通过以下命令,创建一个名为 Flag 的可执行包:

    mkdir Flag
    cd Flag
    swift package init --type executable
    

    在运行 swift package init 命令行时,切换到 Flag 目录是关键的,因为 Flag 将作为包名。你会看到输出中会显示一些文件和文件夹,它们是自动生成的。现在来熟悉一下项目结构:

    https://koenig-media.raywenderlich.com/uploads/2016/12/Flag-%E2%94%9C%E2%94%80%E2%94%80-Package.swi_.png’ width= ‘300’/>

    1. Package.swift 包含包的描述信息,还包含包的依赖。
    2. Sources/,如名称所示,用于存放你的 Swift 源文件。里面会生成一个 main.swift 文件。这是应用程序的入口。现在,它只会打印 hello world。
    3. Tests/ ,包含单元测试,你可以用 XCText 编写这些测试。待会你会写测试代码。

    回到终端窗口,运行:

    swift build
    

    这会编译包并在 .build/debug/ 创建一个可执行文件 Flag。运行这个 app,只需要:

    .build/debug/Flag
    

    你会在屏幕上看到 Hello,world!

    恭喜你!你创建和编译通过了你的第一个 Swift 包!

    创建库

    要真正能够生成某个国家的国企字符,我们需要编写一个名为 Atlas 的库。然后在你的 Flag app 中调用这个库。

    切到 Flag 包之外的目录,通过终端命令创建一个库:

    cd ..
    mkdir Atlas
    cd Atlas
    swift package init --type library
    

    包管理器会创建几个文件和文件夹。

    https://koenig-media.raywenderlich.com/uploads/2017/01/atlas-library-structure.png’ width=’300’/>

    这次,main.swift 会被 Atlas.swift 所替代。这个文件以及在 Sources/ 目录下的文件都会被导入到这个库中。实际上,库和可执行包的区别就在于有没有 main.swift。

    这次我们需要用一个测试。用 swift test 来运行这个测试。Swift 包管理器会编译库并运行测试。

    注意:你会在 Tests/ 目录下看到 LinuxMain.swift 文件,在 AtlasTests 的测试案例类中还有一个 allTests 属性。对于要在 Linux 上运行 XCTest 测试而言,这两者都是必须的。Linux 没有 O-C 运行时,而 O-C 运行时会自动查找以 test 开头的方法并运行它。每当添加一个测试方法,你都需要修改这个 allTests 属性,每当添加一个新的测试案例类,你都需要修改 LinuxMain.swift。

    打开 Atlas.swift 修改内容为:

    public struct Country {
      public let code: String
    
      public init(code: String) {
        self.code = code.uppercased()
      }
    
      public var emojiFlag: String {
        return "\u{1f1f5}\u{1f1f7}"
      }
    }

    这里我们实现了一个 Country 结构,它通过一个 ISO 国别代码进行初始化。emojiFlag 属性根据国别代码返回对应的国旗字符。现在,你需要编写测试。

    注意每个方法和属性都标记为公有的,这样它的每个成员对于使用这个库的代码来说都是课件的:]

    打开 AtlasTests.swift,编辑内容为:

    import XCTest
    @testable import Atlas
    
    class AtlasTests: XCTestCase {
      func testAustria() {
        XCTAssertEqual(Country(code: "AT").emojiFlag, "\u{1f1e6}\u{1f1f9}")
      }
    
      func testTurkey() {
        XCTAssertEqual(Country(code: "TR").emojiFlag, "\u{1f1f9}\u{1f1f7}")
      }
    
      func testUnitedStates() {
        XCTAssertEqual(Country(code: "US").emojiFlag, "\u{1f1fa}\u{1f1f8}")
      }
    }
    
    extension AtlasTests {
      static var allTests : [(String, (AtlasTests) -> () throws -> Void)] {
        return [
          ("testAustria", testAustria),
          ("testTurkey", testTurkey),
          ("testUnitedStates", testUnitedStates)
        ]
      }
    }

    这里实现了 3 个测试。我们创建了 3 个不同的国籍,然后断言它们是否拥有正确的 emoji 国旗字符。

    运行测试:

    swift test
    

    你会看到 3 个测试被运行,但全部失败。这说明我们还有很多事情要干啊 :]

    现在我们测试失败了,我们要让它们通过测试。

    emoji 国旗的工作原理非常简单:传入一个国家代码,比如 AT,然后将每个字符转换成设为的地区指示标志。例如, �� 和 ��。然后将二者组合在一起,你就会得到 emoji 国旗!

    https://koenig-media.raywenderlich.com/uploads/2017/01/ragecomic_flags.png’ width=’600’/>

    回到 Atlas.swift 为 Country 结构增加一个方法:

    func regionalIndicatorSymbol(unicodeScalar: UnicodeScalar) -> UnicodeScalar? {
      let uppercaseA = UnicodeScalar("A")!
      let regionalIndicatorSymbolA = UnicodeScalar("\u{1f1e6}")!
      let distance = unicodeScalar.value - uppercaseA.value
      return UnicodeScalar(regionalIndicatorSymbolA.value + distance)
    }

    这里,我们利用了字母和区域指示标志在 Unicode 表中的值都是连续排列的原理。比如 A 是 65,B 是 66,而 �� 是 127462,�� 就是 127463。如果将字符 P 转换成区域指示标志,需要计算出 A 到 P 的值相差多少,然后将 ��加上这个差值就得到 ��。

    这是最难的部分。写好这个方法后,剩下的事情就简单了。将 emojiFlag 属性定义修改为:

    public var emojiFlag: String {
      return code.unicodeScalars.map { 
      String(regionalIndicatorSymbol(unicodeScalar: $0)!) } .joined()
    }

    我们将国家代码的每个字母放到数组中,然后将每个字母转换成对应的区域指示标志,然后将它们连在一起。这就得到了国旗!

    运行测试,3 个测试都通过了。

    接下来将代码提交到 Git,并标记一个本号。因为这是我们的第一个版本,我们可以将版本标记为 1.0.0。

    执行下列命令,创建 Git 存储库并标记版本:

    git init
    git add .
    git commit -m "Initial commit"
    git tag 1.0.0

    创建可执行包

    现在你已经准备好 Flag 库,我们可以将它添加为 Flag 可执行包的依赖。

    回到 Flag 目录,打开 Package.swift 文件。它目前是这个样子:

    import PackageDescription
    
    let package = Package(
      name: "Flag"
    )

    每个 Swift 包都有一个类似的 PackageDescription。最重要的参数是 dependencies 参数。

    将包描述修改为这样:

    let package = Package(
      name: "Flag",
      dependencies: [
        .Package(url: "../Atlas", "1.0.0")
      ]
    )

    这里,我们声明 Flag 包拥有一个依赖,这个依赖的 URL 是 ../Atlas,版本是 1.0.0。

    版本号应该使用语义上的版本号。简单说,就是类似于 MAJOR.MINOR.PATCH 这样的版本号。MAJOR 版本表示的是不向后兼容的修改,MINOR 版本表示向后兼容的修改,PATCH 版本是 bug 的修复。关于语义版本,细节可参考 这里

    大部分情况下,你只想让新版本在 bug 修复和小版本改进上做修改。幸好,Swift 包管理器允许我们这样做。将包描述修改为:

    let package = Package(
      name: "Flag",
      dependencies: [
        .Package(url: "../Atlas", majorVersion: 1)
      ]
    )

    包管理器提供了你在更新库时想精确控制的版本。请参考这里

    编译包:

    swift build
    

    Swift 包管理器将抓取、编译库并将之连接到你的可执行包。现在的文件夹结构将是这个样子:

    https://koenig-media.raywenderlich.com/uploads/2017/01/flag-structure.png’ width=’300’/>

    你会看到 Swift 包管理器已经细心地根据你的要求将 1.0.0 版本安装到项目中了。打开 main.swift 文件,编辑内容如下:

    import Atlas
    
    let arguments = CommandLine.arguments
    
    if arguments.count != 2 {
      print("USAGE: flag [iso country code]")
    } else {
      let code = arguments[1]
      let country = Atlas.Country(code: code)
      print(country.emojiFlag)
    }

    这里,我们导入了 Atlas 库,根据命令行参数的第一个参数,打印出对应的国旗 emoji。如果缺少参数,我们会打印命令帮助。

    编译运行 app:

    swift build
    ./.build/debug/Flag US

    你在终端窗口中看到了美国国旗!

    在你和你的 app 玩得不亦乐乎的时候,我们该来打包它 了。最后编译一下 app,这次需要加上 release 优化参数:

    swift build --configuration release
    

    现在你可以这样运行你的 release 版 app 了:

    ./.build/release/Flag PR
    

    你可以将 ./.build/release/Flag 文件打包压缩,然后分享给你的朋友、家人或其它人了 :]

    用包管理器生成 Xcode 项目

    老旧的命令行和文本编辑器很酷,但你可能是一个 iOS 或 macOS 程序员,你使用的是 Xcode。别担心——大部分工作 Xcode 都可以做得很好。

    回到 Atlas 包下面,生成一个 Xcode 项目:

    cd ../Atlas
    swift package generate-xcodeproj
    

    这会生成一个 Atlas.xcodeproj 文件。你可以用 Xcode 打开这个项目,像其他 Xcode 项目一样编译包和运行测试。

    https://koenig-media.raywenderlich.com/uploads/2017/01/xcode-650x357.png’ width= ‘600’/>

    同样的方法可以用在 Flag 包上。在 Flag 文件夹下面执行 swift package generate-xcodeproj 命令,生成 Flag.xcodeproj。

    cd ../Flag
    swift package generate-xcodeproj
    

    用 Xcode 打开项目,确认 Flag 可执行目标是否选中,它显示一个小的终端窗口的图标。现在你也可以编译和运行这个包了。

    为了指定可执行命令的参数,请进入 Product\Scheme\Edit Scheme… 窗口,选择 Run\Arguments ,在 Arguments Passed On Launch 中添加一个参数比如 US:

    https://koenig-media.raywenderlich.com/uploads/2017/01/Flag_xcodeproj-650x361.png’ width=’600’/>

    注意,Xcode 无法添加和编译依赖,因此你无法完全离开命令行。

    结束

    你可以从这里下载完成的 Swift 包管理器项目。

    你还可以参考Swift 官网关于包管理器的章节

    关于包描述选项的最新文档,请参考github

    关于 Swift 4 的包管理器修改方向,你可以参考 Swift 演进路线图的邮件列表

    你还可以参考IBM 的 Swift Package Catalog,它可以帮助你找到可以用在你项目中的新包。

    在 Swift 包管理器能够支持非主机平台之前,你仍然不得不使用 Cocoapods 或 Carthage 来构建 iOS、watchOS 和 tvOS app。

    留作今天的作业,你可以将你的库推到 GitHub,然后在 Atlas 中使用它的远程依赖。提示:只需要将 dependency 的 url 参数修改为 GitHub URL。

    尝试添加新的功能,比如当没有提供任何参数时,列出所有国家的名字和国旗。提示:你将需要用到 Locale.isoRegionCodes。

    在 Atlas 库中实现你的新功能,然后创建新的版本,比如 1.1.0,然后在 Flag 中使用这个新版本。确认你在包描述中使用了新版本,然后通过 Swift 包管理器将依赖升级到新版本。

    将你的答案公布到下面的留言中,祝你开心!

    展开全文
  • linux下包管理器

    千次阅读 2018-10-28 22:41:34
    一、操作linux发型版本的包管理器 此小结摘抄:https://www.cnblogs.com/linuxprobe/p/5883783.html   在 linux 中,包管理器非常重要,了解如何使用多种包管理器可以让你像一个高手一样活得很舒适,从在仓库下载...

    一、操作linux发型版本的包管理器

    此小结摘抄:
    https://www.cnblogs.com/linuxprobe/p/5883783.html
     
      在 linux 中,包管理器非常重要,了解如何使用多种包管理器可以让你像一个高手一样活得很舒适,从在仓库下载软件、安装软件,到更新软件、处理依赖和删除软件是非常重要的,这也是Linux 系统管理的一个重要部分。

    • debian派系

      dpkg 是 Debian Linux 家族的基础包管理系统,它用于安装、删除、存储和提供deb包的信息。
    这是一个低层面的工具,并且有多个前端工具可以帮助用户从远程的仓库获取包,或处理复杂的包关系的工具,包括如下:

    (1) apt(高级打包工具)
      这个是一个 dpkg 包管理系统的前端工具,它是一个非常受欢迎的、自由而强大的,有用的命令行包管理器系统。debian 及其衍生版,例如 Ubuntu 和 Linux Mint 的用户应该非常熟悉这个包管理工具。
    (2) aptitude 包管理器
      这个也是 Debian Linux 家族一个非常出名的命令行前端包管理工具,它工作方式类似 APT ,它们之间有很多可以比较的地方,不过,你应该两个都试试才知道哪个工作的更好。它最初为 Debian 及其衍生版设计的,但是现在它的功能延伸到 RHEL 家族。
    (3) synaptic 包管理器
      synaptic是一个基于GTK+的APT的可视化包管理器,对于一些不想使用命令行的用户,它非常好用。

    • 红帽派系

    rpm 包管理器
      这个是红帽创建的 Linux 基本标准(LSB)打包格式和基础包管理系统。基于这个底层系统,有多个前端包管理工具可供你使用,但我们应该只看那些最好的,那就是:

    (1) yum
      这个是一个开源、流行的命令行包管理器,它是用户使用 RPM 的界面(之一)。你可以把它和 Debian Linux 系统中的 APT 进行对比,它和 APT 拥有相同的功能。

    (2) dnf
      这个也是一个用于基于 RPM 的发行版的包管理器,Fedora 18 引入了它,它是下一代 YUM。如果你用 Fedora 22 及更新版本,你肯定知道它是默认的包管理器。这里有一些链接,将为你提供更多关于 DNF 的信息和如何使用它。

    • 其他派系

    (1) Pacman包管理器(Arch Linux)
      这个是一个流行的、强大而易用的包管理器,它用于 Arch Linux 和其他的一些小众发行版。它提供了一些其他包管理器提供的基本功能,包括安装、自动解决依赖关系、升级、卸载和降级软件。但是最大的用处是,它为 Arch 用户创建了一个简单易用的包管理方式。

    (2) Zypper 包管理器(openSUSE)
      这个是一个使用 libzypp 库制作的用于 OpenSUSE 系统上的命令行包管理器,它的常用功能包括访问仓库、安装包、解决依赖问题和其他功能。更重要的是,它也可以支持存储库扩展功能,如模式、补丁和产品。

    (3) Portage 包管理器(Gentoo)
      这个是 Gentoo 的包管理器,当下不怎么流行的一个发行版,但是这并不阻止它成为 Linux 下最好的软件包管理器之一。Portage 项目的主要目标是创建一个简单、无故障的包管理系统,包含向后兼容、自动化等功能。

    二、rpm包管理器

    2.1、程序概述以及rpm概述

    API:Application Program Interface,应用程序接口;
    ABI:Application Binary Interface,应用二进制接口;
    
    至于二者的区别,之前也有讲过,这里拿一张别人画好的图:

    https://blog.csdn.net/FatalError1/article/details/78362829
    linux下包管理器

    • C/C++程序格式
      源代码:文本格式的程序代码;
      编译开发环境:编译器、头文件、开发库
      二进制格式:文本格式的程序代码 - -> 编译器 - -> 二进制格式(二进制程序、库文件、配置文件、帮助文件)
    • java/python程序格式
      源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式;
      开发环境:编译器、开发库
      二进制
    • 项目构建工具

      c/c++: make
      java: maven
    • 源代码格式和二进制rpm包格式
    源代码命名:name-VERSION-release.tar.gz 
    .tar.gz只是一种,通常是使用tar打包归档,并使用gzip压缩;
    VERSION:major.minor.release(主版本号.次版本号.发型号);
    name:源代码所代表的应用程序的名字;
    例如:redis-5.0.0.tar.gz
    
    rpm包命名:
    name-VERSION-release.arch.rpm
    VERSION:major.minor.release(软件包主版本号.次版本号.发型号);
    release.arch:rpm包的发型号;
    其中的release由release.os组成,(release表示发型号的版本,os表示系统说明)
    arch可选值有:i386, x64(amd64), ppc, noarch等等
    
    例如:redis-5.0.0-1.centos7.x64.rpm
    
    • rpm概述
    rpm是一款能够用于编译,安装,查询,验证,更新以及移除软件包的包管理器。包由文件和元数据构成。
    元数据构成:
    二进制程序文件,库文件,配置文件,帮助文件等;
    
    包的两种形式,上面有提到过,一种是二进制包格式,另外一种是源码包格式。
    二进制包已经封装好了要安装的程序,源码包就是由程序源代码以及要生成二进制格式的一些附加配置构成;
    
    rpm包就是由二进制格式组成的,不过为了最小化功能模块设计,一个应用程序被打包成rpm包的时候,可能
    组成了不止一个rpm包,比如像mysql这种的应用程序,可能由devel,utils,libs等组成各个小包,我们称这些
    为分包或支包,如果要想完整的使用应用程序,我们应该先安装对应程序的主包,然后把这些辅助的支包也安装
    上。主包和支包(这种机制叫拆包)命名:
    主包:name-VERSION-release.arch.rpm 
    支包:name-function-VERSION-release.arch.rpm
    其中function表示一类辅助功能,常见的有:
    devel,utils,libs等
    
    rpm管理器有个弊端就是不能自动解决程序包依赖关系的问题,何为依赖关系:
    比如我要安装X,Y,Z程序包,安装X程序包要依赖于Y和Z程序包,而安装Y程序包要依赖于A,B,C程序包,
    然后安装A程序要依赖于Y程序包,依赖我的Y程序包还没安装,而后Y程序包要装的软件包又依赖
    于Y程序包本身,这种是很常见的,在rpm管理器中没能得到解决,我们只能找出依赖,先把依赖包安装好,
    然后运气好的话,没有这种互相关联,我们可以解决,如果是互相关联的,就没有办法了。而rpm包的前端
    工具,例如yum,就很好的解决了软件包依赖的关系。
    
    程序包管理器的功能(例如rpm):
    将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、
    卸载和查询等管理操作;
    1、程序包的组成清单(每个程序包都单独实现);
        文件清单
        安装或卸载时运行的脚本
    2、数据库(公共)
        程序包的名称和版本;
        依赖关系;
        功能说明;
        安装生成的各文件的文件路径及校验码信息;
        等等等
    
    获取程序包的途径:
    1、系统发行版的光盘或官方的文件服务器(或镜像站点):
    http://mirrors.aliyun.com 这是是国内阿里云提供的公共镜像站点;
    http://mirrors.sohu.com   这是国内搜狐提供的公共镜像站点;
    http://mirrors.163.com     这是163组织提供的公共镜像站点;  
    2、项目的官方站点
    3、第三方组织:
        (1) EPEL
        (2) 搜索引擎
            http://pkgs.org
            http://rpmfind.net 
            http://rpm.pbone.net 
    4、自己部署搭建镜像站点或者主机打包rpm包
    
    建议:检查其合法性
        来源合法性;
        程序包的完整性;
    

    2.2、rpm常见选项

    rpm简单组织语法格式:

    rpm [OPTION] [PACKAGE_FILE]
    其中OPTION根据rpm实现的每种功能,有分别的主选项,例如:
    查询:-q或-query
    校验:-V或--verify
    安装:-i或--install
    升级:U或--upgrade,-F或--freshen
    卸载:-e或--erase

    2.2.1、rpm的通用选项

    -?, --help:查看帮助信息;
    --version:查看版本;
    --quiet:安静模式;
    -v:详细信息;
    -vv:更详细的输出;

    2.2.2、rpm与安装相关的选项

    语法格式:
    rpm {-i|--install} [install-options] PACKAGE_FILE ...
    其中-i或--install表示安装功能主选项;
    install-options表示安装的子选项;
    
    -h, --hash:hash marks输出进度条;每个#表示2%的进度;
    --test:测试安装,检查并报告依赖关系及冲突消息等;
    --nodeps:忽略软件包的依赖关系(正常情况不应该忽略);
    --replacepkgs:重新安装;
    --replacefiles:如果其他程序安装过相应文件,会覆盖安装;
    --oldpackage:允许降级安装软件包;
    --force:--replacepkgs, --replacefiles, and --oldpackage的组合;
    
    PS:rpm包安装,可以附带四类安装脚本,分别为:
    preinstall:安装过程开始之前运行的脚本,%pre
    postinstall:安装过程完成之后运行的脚本,%post
    preuninstall:卸载过程真正开始执行之前运行的脚本,%preun
    postuninstall:卸载过程完成之后运行的脚本,%postun
    
    --nopre:不执行"安装过程开始之前要运行的脚本片段";
    --nopost:不执行"安装过程完成之后运行的脚本片段";
    --nopreun:不执行"卸载过程开始执行之前运行的脚本片段";
    --nopostun:不执行"卸载过程完成之后运行的脚本片段";
    --noscripts:相当于--nopre --nopost --nopreun --nopostun
    --nodigest:不检查包完整性信息;
    --nosignature:不检查包签名信息,不检查来源合法性;
    --justdb:只安装数据库,不包安装安装文件系统的文件;(通过查询选项还是可以列出安装的文件,不过
    实际并不存在,卸载的时候也要加上该选项);
    
    PS:安装的时候,rpm的数据库没有记录软件包的相关记录,应该指明完整的rpm包名;

    2.2.3、rpm与升级相关的选项

    语法格式:
    rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
    这个-U是升级或安装,如果已经安装了且存在新版本,会移除旧版本并升级成新版本,简称升级或安装软件包;
    
    rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
    这个-F只升级软件包,如果指定软件包没有安装,不会安装;
    
    至于升级的选项,很多与安装的选项相同
    --justdb:只安装数据库,不包安装安装文件系统的文件;(通过查询选项还是可以列出安装的文件,不过
    实际并不存在,卸载的时候也要加上该选项);
    --force:强制,相当于--replacepkgs, --replacefiles, and --oldpackage;
    --oldpackage:降级;
    等等,其他选项,请看上一小结。
    
    注意事项:
    (1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;
    (2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有
    版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
    

    2.2.4、rpm与卸载相关的选项

    语法结构:
    rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
    --allmatches:指定软件包如果有多个版本,会卸载掉多有的版本(正常情况如果有多个版本存在,卸载检测
    出来,会报错);
    --nodeps:卸载软件包前不检查依赖关系;
    --test :测试卸载,不真正执行;
    --nopreun:不执行"卸载过程开始执行之前运行的脚本片段";
    --nopostun:不执行"卸载过程完成之后运行的脚本片段";
    --noscripts:等价于 --nopreun --nopostun;
    
    PS:卸载的时候,不能指明完整的包名,只需要指定要卸载的软件包的名字即可。

    2.2.5、rpm与查询相关的选项(最核心之一)

    语法格式:
    rpm {-q|--query} [select-options] [query-options]
    
    select-options:
    -a, --all:查询所有已经安装过的软件包;
    -f, --file FILE:查询指定文件由哪一个软件包提供;
    -g, --group GROUP:查询指定开发包组中对应程序包,系统已经安装的有哪些;
    -p, --package PACKAGE_FILE:用于实现对未安装的程序包进行查询操作;
    --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供
    --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
    
    query-options:
    --changelog:查询软件包的改变信息;
    -l, --list:查询软件包安装生成的所有文件列表;
    -i, --info:查询程序包的相关信息,包括名字,版本号,大小,所属包组,描述信息等;
    -c, --configfiles:查询软件包提供的配置文件列表;(已经隐式含有-l,不用显式再指明-l选项)
    -d, --docfiles:查询软件包提供的文本文件列表;(已经隐式含有-l,不用显式再指明-l选项)
    --dump:导出(打印)软件包的以下部分的详细信息(隐式含有-l选项)
    path size mtime digest mode owner group isconfig isdoc rdev symlink
    路径 大小 修改事件 摘要码 权限 文件属主 文件属组 是否为配置文件 是否为文件文件, 设备相关,链接相关
    --filesbypkg:查询所有指定软件包的安装的文件列表(每个文件前边会有软件包名,再查找多个软件包的文件列表
    的时候可便于区分);
    -i, --info:查询程序包的相关信息,包括名字,版本号,大小,所属包组,描述信息等;
    -L, --licensefiles:查询软件包的许可证信息;
    --provides:查询软件包的CAPABILITY(能力);
    -R, --requires:查询指定软件包的依赖能力关系(这里的依赖关系不一定到一个软件包,因为能力是一种体现,
    一个软件包可以有多个能力);
    --scripts:查询软件包自带的脚本片段;
    

    2.2.6、rpm与校验相关的选项

    语法结构:
    rpm {-V|--verify} [select-options] [verify-options]
    select-options和查询的select-options相同;
    
    verify-options:
    --nodeps:校验的时候不检查软件包的依赖关系;
    --nodigest:校验的时候不检查包完整性;
    --nosignature:校验的时候不检查包签名信息和来源合法性;
    
    输出格式由9个字符组成的字符串,可能用来标识的属性有:
    c %config configuration file. 配置文件
    d %doc documentation file. 文档文件;
    g %ghost file (i.e. the file contents are not included in the package payload).
    l %license license file.: 许可证文件
    r %readme readme file. 说明文件
    
    字符构成:
    如果对应字符位置标记为符号"."表示校验通过,没有异常,如果为符号"?",表示检测异常,可能因为没有权限等
    原因造成,如果标记为以下字符表示对应属性检测失败(软件包本身属性不变,如果有修改,对应字段会作出
    相应的标记,不是所检测不同就表示有问题,只能说与元件包原始提供的检测不一样):
    S file Size differs    标记为S表示文件大小不同;
    M Mode differs (includes permissions and file type) 标记为M表示权限不同(包括权限和文件类型)
    5 digest (formerly MD5 sum) differs 标记为5 表示消息摘要码不一样;
    D Device major/minor number mismatch 标记为D表示主设备号或次设备号不匹配;
    L readLink(2) path mismatch 标记为L表示路径不匹配;
    U User ownership differs 标记为U表示文件的属主不同;
    G Group ownership differs 标记为G表示文件的属组不同;
    T mTime differs 标记为T表示文件的修改时间不同;
    P caPabilities differ 标记为P表示软件包提供的能力检测不同;
    
    包来源合法性验证和完整性验证:
        来源合法性验正:
        完整性验正:
    
    获取并导入信任的包制作者的密钥:
        对于CentOS发行版来说:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
    验证:
        (1) 安装此组织签名的程序时,会自动执行验正;
        (2) 手动验证:rpm -K PACKAGE_FILE
    
    PS:校验rpm软件包也不能带上rpm的全路径,只需要指明rpm包的名字即可;

    2.2.7、rpm与数据库维护相关

    数据库重建:
        rpm管理器数据库路径:/var/lib/rpm/
        查询操作:通过的rpm的数据库进行;
    
    获取帮助:
        CentOS 6:man rpm
        CentOS 7:man rpmdb
    
    rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
        --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
        --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;

    2.3、实际案例

    本小结主要以光盘中的一个名叫zsh的软件包进行演示操作说明。
    1、查询
    linux下包管理器

    linux下包管理器

    linux下包管理器

    2、安装和升级安装,卸载

    linux下包管理器

    3、校验和数据库维护

    linux下包管理器

    linux下包管理器

    学完rpm,记得把这个链接的10多个常见问题看一下,非常有用:
    http://fedoranews.org/alex/tutorial/rpm/

    Problem 1: Install or Upgrade a package? Can I install an old one?
    Problem 2: Remove a package? Is it going to remove any dependencies?
    Problem 3: Query installed packages? What about a RPM file?
    Problem 4: List what packages are required by some RPM package?
    Problem 5: Find from which package the file /usr/bin/smbmount belongs?
    Problem 6: List what files will be installed by a RPM package?
    Problem 7: Install a package directly from Internet? Can I use a proxy?
    Problem 8: Simulate what will be done when executing "rpm -ivh new-kernel.rpm"?
    Problem 9: Upgrade all my installed packages with one Freshen command?
    Problem 10: Figure out the Kernel version(smp, bigmem) and base arch(i386, athlon)?
    Problem 11: Install a new Kernel version but keeping my old one installed?
    Problem 12: Make backups of my old packages when updating or removing them?
    Problem 13: Build a RPM package from a SRPM with rpmbuild?
    Problem 14: Check digests and signatures against a package?
    Problem 15: See what RPM macros are defined on my system?
    Problem 16: Get rpm back? The command "rpm -qa" returns nothing!
    Problem 17: Figure out the installation time of my packages? [User Contribution]
    Problem 18: Figure out the size of a installed package? [User Contribution]
    
    1、安装和升级软件包,我可以使用旧软件包吗?
    2、如何卸载软件包,会卸载掉依赖文件吗?
    3、查询已经安装的软件包,以及rpm的安装文件信息?
    4、列出依赖于rpm包的包以及文件?
    5、查找某个程序文件属于哪一个软件包?(比如查询/usr/bin/smbmount输出哪个软件包)
    6、列出rpm软件包将要安装的文件?
    7、如何直接从互联网安装一个软件包?我可以使用代理吗?(例如使用ftp协议或者http协议)
    8、如何模拟安装一个软件包?
    9、如何一次升级所有已经安装过的软件包?
    10、如何查询自己的内核版本以及系统体系架构?
    11、安装一个新的内容版本并且保留之前已经安装过的旧版本?
    12、在升级或卸载软件包的时候,如果备份软件包?
    13、使用rpmbuild工具从SRPM格式构建出对应的RPM包?(这个涉及到rpm包的制作知识点,有兴趣可以查阅)
    14、如何检验包的完整性和来源合法性?
    15、查看我的系统定义的和RPM包相关的宏有哪些?(这个涉及到rpm包的制作知识点,有兴趣可以查阅)
    16、有时候"rpm -qa"查询不出东西,怎么处理?
    17、如何计算包的安装时间?(这个是用户提交的,非官方)
    18、如何计算出已经安装包的大小?(这个是用户提交的,非官方)

    三、rpm包管理器的前端工具yum

    3.1、yum概述

    yum是一个交互式的基于rpm实现的包管理器。它可以自动执行系统的更新,包括依赖性分析以及基于"仓库(repository)"的元数据库过时的处理。它也能够实现安装(新)软件包,卸载(旧)软件包以及对已经安装的软件包的查询,或者向其他命令或程序提供可用的软件包。yum和其他高级的软件包管理工具是相似的,例如像apt-get或smart。

    yum可以解决rpm安装软件包依赖的问题,不过yum是基于rpm来实现的,所以如果rpm使用有异常或者环境有问题,yum可能会使用异常。
    yum - Yellowdog Updater Modified,通常都叫小黄狗。yum是rpm的前端工具实现,可以从指定服务器上自动下载程序包,并自动分析程序包的元数据、自动处理程序包之间的依赖关系,能一次性安装完所有依赖的包,而无须繁琐地一次次安装所有依赖包。yum访问访问文件服务器(俗称yum仓库,yum repository)的模式是基于C/S架构的,而文件服务器(repository)则需要以某种共享服务方式将其提供的程序包及包相关的元数据提供给其他主机使用,通常使用到的协议有http、https、ftp、nfs等。此外,还可以使用光盘作为本地仓库或者自己制作本地仓库,通常使用到的协议是file。

    上面有提到repository,yum的repository俗称yum仓库(yum repo),这个仓库里面存储了很多rpm包以及存放于特定
    repodata目录下的包的相关元数据文件。既然yum访问yum仓库的模式是C/S架构,所以就必然有个yum客户端和
    yum服务端的概念。

    • yum客户端
    配置文件:
        /etc/yum.conf:为所有仓库提供公共配置
        /etc/yum.repos.d/*.repo:为仓库的指向提供配置
    
    yum仓库指向的配置文件:
    [repositoryID]    这个表示仓库的id表示,不同的yum仓库配置不能相同;
    name=Some name for this repository    这个是仓库的名字;
    baseurl=url://path/to/repository/   这个是访问真正的yum服务端的url指向;
    enabled={1|0}   仓库是否启用,1表示启用(默认值),0表示未启用;
    gpgcheck={1|0}   是否要对程序包数据的来源合法性和数据完整性做校验;,1表示检查,0表示不检查;
    gpgkey=URL     指定GPG密钥文件的访问路径,可由仓库提供;;(如果gpgcheck启用,这里就要指向)
    enablegroups={1|0}  是否允许以组的方式管理仓库;
    failovermethod={roundrobin|priority}
        默认为:roundrobin,意为随机挑选;
        当baseurl同时指向多个仓库路径时,可指定以什么方式选择url去访问仓库,以及当某一路径访问
    失败时,可指定如何再选择路径;roundrobin是随机挑选路径访问,priority是自上而下选择路径访
    问;
    cost=
        开销;开销越小,该仓库url更优;默认值为1000.
    
    • yum服务端(yum仓库)
      至于服务端,没什么好说的,我们上面有讲过客户端了,我们来通过几张图来简要说明。
      摘抄:

    linux下包管理器

    linux下包管理器

      用户使用yum去请求安装某一个程序包时,yum工具会先去yum配置文件中查找yum仓库指向的路径,根据该路径去访问远程或本地的文件服务器,这个服务器作为yum仓库并且存储了众多的rpm包以及包相关的元数据文件。当yum根据仓库路径访问到仓库后,会首先尝试请求获取rpm包的元数据文件并缓存至本地(/var/cache/yum目录),而这个元数据文件包括了该仓库所有rpm包的程序包名、版本号、依赖性以及每个程序包所提供的capabilities等。而后,yum根据用户要安装的程序包名去元数据文件里查找,看看仓库里是否有用户请求下载的程序包文件,如果找到了则根据元数据文件分析该程序包的依赖关系并分析本地系统上有哪些包已安装、哪些包还没安装,再将所有用户需要安装且本地尚未安装的程序包名列出来,并以客户端的角色发送至文件服务器(仓库)请求下载之。如果请求成功,则yum将要安装的程序包文件也缓存至本地并执行安装操作。安装完成之后将缓存的程序包文件删除以节约空间,而缓存中只留下元数据文件。

      为什么只缓存元数据而不缓存程序包呢?因为程序包一般只安装一次即可,很少会再安装第二次,而且基于节约空间的考虑,因此yum在安装完程序包后会将缓存中的程序包删除。而缓存元数据好处则是当下一次用户使用yum请求安装程序包时可以节约带宽,无需再次重新请求获取全部的元数据文件,并且可以提高本地分析程序包的速度。

      当用户第二次使用yum请求安装程序包时,基于实时同步更新缓存以及节约带宽的考虑,yum会先请求下载yum仓库下rpm包元数据的校验码文件至本地,将其与本地缓存上的元数据校验码相比较,如果相同,说明无须更新;如果不同,则说明仓库中rpm包已经更新,因此yum会重新请求下载仓库上的元数据文件以更新元数据缓存。接着同样是分析程序包依赖性、请求要安装的全部程序包等。

    3.2、yum常见选项

    语法结构:
    yum [options] [command] [package ...]
    
    options表示选项,command表示使用的命令,package表示软件包的名字;
    
    command is one of:
     * install package1 [package2] [...]
     * update [package1] [package2] [...]
     * update-to [package1] [package2] [...]
     * update-minimal [package1] [package2] [...]
     * check-update
     * upgrade [package1] [package2] [...]
     * upgrade-to [package1] [package2] [...]
     * distribution-synchronization [package1] [package2] [...]
     * remove | erase package1 [package2] [...]
     * autoremove [package1] [...]
     * list [...]
     * info [...]
     * provides | whatprovides feature1 [feature2] [...]
     * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
     * makecache [fast]
     * groups [...]
     * search string1 [string2] [...]
     * shell [filename]
     * resolvedep dep1 [dep2] [...]
        (maintained for legacy reasons only - use repoquery or yum provides)
     * localinstall rpmfile1 [rpmfile2] [...]
        (maintained for legacy reasons only - use install)
     * localupdate rpmfile1 [rpmfile2] [...]
        (maintained for legacy reasons only - use update)
     * reinstall package1 [package2] [...]
     * downgrade package1 [package2] [...]
     * deplist package1 [package2] [...]
     * repolist [all|enabled|disabled]
     * repoinfo [all|enabled|disabled]
     * repository-packages <enabled-repoid> <install|remove|remove-or-reinstall|remove-or-distribution-synchronization>
    [package2] [...]
     * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
     * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
     * load-transaction [txfile]
     * updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all | check-running-kernel]
     * fssnapshot [summary | list | have-space | create | delete]
     * fs [filters | refilter | refilter-cleanup | du]
     * check
     * help [command]
    
    options:
    1、repolist:显示仓库列表;
    repolist [all|enabled|disabled]
    如果指定enabled:表示只显示启用的仓库列表;
    如果指定disabled:表示只显示关闭的仓库列表;
    如果指定all:表示显示启用和关闭的仓库列表;
    默认的repolist的参数是enabled。
    repolist [all|enabled|disabled] 后边还可以通过仓库的id或者名字来查找,并且支持bash通配符机制;
    repolist [all|enabled|disabled] "Repo-id"
    repolist [all|enabled|disabled] "Repo-name"
    
    有时候需要配置-v选项一起,查看详细信息;
    
    2、repoinfo:查看仓库详细信息
    repoinfo [all|enabled|disabled]
    repoinfo命令和repolist [all|enabled|disabled] -v等价;
    
    3、list:显示程序包
    yum list [all | glob_exp1] [glob_exp2] [...]
    列出所有可用和已经安装的软件包;
    yum list available [glob_exp1] [...]
    列出yum仓库所有可用的的安装包;
    yum list updates [glob_exp1] [...]
    列出yum仓库所有可用的更新包;
    yum list installed [glob_exp1] [...]
    列出所有已经安装的软件包;
    yum list extras [glob_exp1] [...]
    列出所有系统已经安装的软件包却不能被yum仓库的配置文件所列出(通过rpm安装的或者之前yum仓库安装
    后来yum仓库被移除了等)软件包列表;
    yum list distro-extras [glob_exp1] [...]
    列出所有已经安装的软件包却不能根据yum配置文件列出的yum仓库的名字所匹配(yum仓库已经被移除了)软件包
    列表;
    yum list obsoletes [glob_exp1] [...]
    列出系统已经安装却被rpm仓库的配置文件列表指向yum仓库人为软件包已经过时了的软件包列表;
    yum list recent
       List  packages recently added into the repositories. This is often not helpful, but what you may really want
       to use is "yum list-updateinfo new" from the security yum plugin.
    列出最近加入yum仓库的软件包列表。
    
    4、install:安装
    install package1 [package2] [...]
    
    5、reinstall:重新安装
    reinstall package1 [package2] [...]
    
    6、update:升级更新
    update [package1] [package2] [...]
    不指定软件包名或者指定参考没有匹配(可以使用bash通配机制)软件包,会更新所有软件包;
    
    7、downgrade:降级
    downgrade package1 [package2] [...]
    
    8、check-update:检查是否有可用的升级
    返回状态值为100表示有可用的软件包升级(正常会返回可用的软件包更新列表);
    返回状态值为0表示无可用的软件包升级;
    返回状态值为1表示运行报错;
    
    9、remove or erase:卸载软件包
    remove | erase package1 [package2] [...]
    yum默认有保护yum自身的机制,不能对yum本身进行卸载;
    
    10、info:查看程序包信息
    列出描述和摘要信息,可选的指定选项和list一样,下面只理出,不再次说明含义。
    yum info [all | glob_exp1] [glob_exp2] [...]
    yum info available [glob_exp1] [...]
    yum info updates [glob_exp1] [...]
    yum info installed [glob_exp1] [...]
    yum info extras [glob_exp1] [...]
    yum info distro-extras [glob_exp1] [...]
    yum info obsoletes [glob_exp1] [...]
    yum info recent
    用的最多的就是:
    yum info package_name类似于rpm -qi package_name或者rpm -qpi package_name.xxx.rpm
    
    11、search:搜索程序包
    search [all] string1 [string2] [...]
    以指定的关键字搜索程序包名及summary信息;
    默认是根据报名和摘要信息进行搜索,如果检索失败,会去详细描述信息和url中去检索;
    可以显式指明all来增大检索的范围,搜索的结果会有一定的排序;
    
    12、provides 或 whatprovides:查看指定的特性是由哪个程序包提供
    provides | whatprovides feature1 [feature2] [...]
    
    13、clean:清理本地缓存
    yum clean expire-cache  清理过期缓存;
    yum clean packages   清理包;
    yum clean headers  清理头文件;
    yum clean metadata 清理元数据;
    yum clean dbcache 清理sqlite数据库缓存;
    yum clean rpmdb 清理本地的rpmdb缓存;
    yum clean plugins 清理插件;
    yum clean all 清理所有的
    
    14、makecache:构建本地缓存
    makecache [fast]
    不加fast,会对所有启用的仓库构建本地缓存数据;
    加fast,速度更快,不过只会对过期的缓存进行重新缓存,已经缓存且没过期的不会;
    
    15、deplist:查看指定的软件包所依赖的能力(capabilities)
    deplist package1 [package2] [...]
    
    16、history:查看yum事务历史
    history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    不常用,这里不进行讲解每个选项的含义。
    
    17、安装及升级本地程序包:
    * localinstall rpmfile1 [rpmfile2] [...]
       (maintained for legacy reasons only - use install)
    * localupdate rpmfile1 [rpmfile2] [...]
       (maintained for legacy reasons only - use update)
    这是一个早期的版本的选项,就是如果你本地有一个rpm文件,你可以直接通过yum 指定这个rpm文件(接的全名)
    来安装(会解决依赖管理,去启用的仓库中寻找依赖的软件包)。
    CentOS 6.x和CentOS 7.x直接使用:
    yum install package_name.xxx.rpm
    yum update package_name.xxx.rpm
    
    18、包组管理相关:
    * groupinstall group1 [group2] [...]   #安装开发包组
    * groupupdate group1 [group2] [...]  #更新开发包组
    * grouplist [hidden] [groupwildcard] [...] #列出开发包组的信息
    * groupremove group1 [group2] [...] #卸载开发包组
    * groupinfo group1 [...]  #查看开发包组的摘要信息(包含软件包列表)
    
    yum的命令行选项:
    --nogpgcheck:禁止进行gpg check;
    -y: 自动回答为“yes”;
    -q:静默模式;
    --disablerepo=repoidglob:临时禁用此处指定的repo;
    --enablerepo=repoidglob:临时启用此处指定的repo;
    --noplugins:禁用所有插件;
    

    3.3、自己配置yum仓库

    3.3.1、配置本地yum仓库

    我们本地有个iso的光盘,里面有很多软件包,简单来看看如何配置yum的客户端,然后通过挂载光盘
    到文件系统上,通过本地文件系统安装管理软件包。
    
    (1) 挂载光盘至某目录,例如/media/cdrom
    mkdir -p /media/cdrom  #创建光盘挂载点
    mount -r -t iso9660 /dev/cdrom /media/cdrom #只读挂载光盘文件到/dev/cdrom下(iso9660表示光盘的类型)
    
    (2) 创建配置文件
    最少可选模板,
    [repository-id]
    name=
    baseurl=
    gpgcheck=
    enabled=
    
    [root@node2 ~]# cd /etc/yum.repos.d/
    [root@node2 yum.repos.d]# mkdir -p /media/cdrom
    [root@node2 yum.repos.d]# mount -r -t iso9660 /dev/cdrom /media/cdrom/
    [root@node2 yum.repos.d]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda3        98G  1.5G   97G   2% /
    devtmpfs        229M     0  229M   0% /dev
    tmpfs           238M     0  238M   0% /dev/shm
    tmpfs           238M  8.8M  230M   4% /run
    tmpfs           238M     0  238M   0% /sys/fs/cgroup
    /dev/sda1       397M   94M  303M  24% /boot
    tmpfs            48M     0   48M   0% /run/user/0
    tmpfs            48M     0   48M   0% /run/user/1000
    tmpfs            48M     0   48M   0% /run/user/1007
    /dev/sr0        4.1G  4.1G     0 100% /mnt
    [root@node2 yum.repos.d]# ls -l /media/cdrom/
    total 614
    -rw-r--r-- 1 root root     16 Apr  1  2015 CentOS_BuildTag
    drwxr-xr-x 3 root root   2048 Mar 28  2015 EFI
    -rw-r--r-- 1 root root    215 Mar 28  2015 EULA
    -rw-r--r-- 1 root root  18009 Mar 28  2015 GPL
    drwxr-xr-x 3 root root   2048 Mar 28  2015 images
    drwxr-xr-x 2 root root   2048 Mar 28  2015 isolinux
    drwxr-xr-x 2 root root   2048 Mar 28  2015 LiveOS
    drwxr-xr-x 2 root root 589824 Apr  1  2015 Packages
    drwxr-xr-x 2 root root   4096 Apr  1  2015 repodata
    -rw-r--r-- 1 root root   1690 Mar 28  2015 RPM-GPG-KEY-CentOS-7
    -rw-r--r-- 1 root root   1690 Mar 28  2015 RPM-GPG-KEY-CentOS-Testing-7
    -r--r--r-- 1 root root   2883 Apr  1  2015 TRANS.TBL
    
    这是我配置的yum仓库客户端的配置文件
    [root@node2 yum.repos.d]# cat local-base.repo
    [CentOS7-localbase]
    name=CentOS 7 local iso base
    baseurl=file:///media/cdrom
    gpgcheck=0
    enabled=1
    
    [root@node2 yum.repos.d]# yum repolist
    Loaded plugins: fastestmirror
    CentOS7-localbase                                                                                      | 3.6 kB  00:00:00     
    (1/2): CentOS7-localbase/group_gz                                                                      | 154 kB  00:00:00     
    (2/2): CentOS7-localbase/primary_db                                                                    | 2.7 MB  00:00:00     
    Loading mirror speeds from cached hostfile
     * base: mirrors.163.com
     * extras: mirrors.shu.edu.cn
     * updates: mirrors.163.com
    repo id                                                  repo name                                                      status
    CentOS7-localbase                                        CentOS 7 local iso base                                        3,576
    base/7/x86_64                                            CentOS-7 - Base                                                9,911
    extras/7/x86_64                                          CentOS-7 - Extras                                                432
    updates/7/x86_64                                         CentOS-7 - Updates                                             1,602
    repolist: 15,521
    上面可以看出,我们的配置的已经可以被查询出来了。
    
    yum的repo配置文件中可用的变量:
        $releasever: 当前OS的发行版的主版本号;
        $arch: 平台;
        $basearch:基础平台;
        $YUM0-$YUM9
    

    3.3.2、配置网络yum仓库

    自己准备一些软件包,然后构建一个yum的服务端仓库,然后通过http协议给本地机器走http协议访问。
    
    yum server:
    
    1、创建一个文件系统目录,上传一些软件包(模拟测试用的)
    [root@node2 ~]# mkdir -p /data/yum_server
    [root@node2 ~]# cd /data/yum_server
    [root@node2 yum_server]# ls /data/yum_server
    DenyHosts-2.6.tar.gz           nginx-1.10.3.tar.gz   redis-3.2.11.tar.gz  redis-4.0.3.tar.gz  redis-4.0.9.tar.gz
    extundelete-0.2.4.tar.bz2      nginx-1.12.2.tar.gz   redis-3.2.3.tar.gz   redis-4.0.4.tar.gz  ss5-3.8.9-8.tar.gz
    fping-2.4b2-10.el6.x86_64.rpm  nginx-1.14.0.tar.gz   redis-3.2.8.tar.gz   redis-4.0.5.tar.gz  tcl8.6.6-src.tar.gz
    keepalived-1.2.20.tar.gz       nginx-1.6.3.tar.gz    redis-4.0.0.tar.gz   redis-4.0.6.tar.gz
    kubernetes-1.11.2.zip          Python-2.7.13.tar.xz  redis-4.0.1.tar.gz   redis-4.0.7.tar.gz
    lynis-2.5.7.tar.gz             redis-3.2.10.tar.gz   redis-4.0.2.tar.gz   redis-4.0.8.tar.gz
    
    2、安装createrepo
    [root@node2 yum_server]# rpm -q createrepo
    package createrepo is not installed
    [root@node2 yum_server]# yum install createrepo
    ......
    
    3、 初始化repodata索引文件
    -d --database
           Generate sqlite databases for use with yum. This is now the default.
    -p --pretty
           Output xml files in pretty format.
    -o --outputdir <url>
           Optional output directory (useful for read only media).
    
    [root@node2 yum_server]# createrepo -pdo /data/yum_server/ /data/yum_server/
    Spawning worker 0 with 1 pkgs
    Workers Finished
    Saving Primary metadata
    Saving file lists metadata
    Saving other metadata
    Generating sqlite DBs
    Sqlite DBs complete
    [root@node2 yum_server]# ls /data/yum_server/
    DenyHosts-2.6.tar.gz           nginx-1.10.3.tar.gz   redis-3.2.11.tar.gz  redis-4.0.3.tar.gz  redis-4.0.9.tar.gz
    extundelete-0.2.4.tar.bz2      nginx-1.12.2.tar.gz   redis-3.2.3.tar.gz   redis-4.0.4.tar.gz  repodata
    fping-2.4b2-10.el6.x86_64.rpm  nginx-1.14.0.tar.gz   redis-3.2.8.tar.gz   redis-4.0.5.tar.gz  ss5-3.8.9-8.tar.gz
    keepalived-1.2.20.tar.gz       nginx-1.6.3.tar.gz    redis-4.0.0.tar.gz   redis-4.0.6.tar.gz  tcl8.6.6-src.tar.gz
    kubernetes-1.11.2.zip          Python-2.7.13.tar.xz  redis-4.0.1.tar.gz   redis-4.0.7.tar.gz
    lynis-2.5.7.tar.gz             redis-3.2.10.tar.gz   redis-4.0.2.tar.gz   redis-4.0.8.tar.gz
    [root@node2 yum_server]# ls /data/yum_server/repodata
    0dd81bd3480e1b700ef4d8501952ada4c17f0f7aa6e33b2ecdc1986327bcef70-primary.sqlite.bz2
    54b9a1903b8bd39bcfd5c1e35840a19891a1187d078a009b4882aedf24e21154-filelists.sqlite.bz2
    59026382882aae681f9af6f060b7d151f36be0e82583dcd07652cc7bb74d9f8c-other.sqlite.bz2
    71b15f14ece520f2722a1648481a433c30e4bff9e407b89ad4d22f0ec40b90bd-other.xml.gz
    cb1c34973cff8ddb6b6f40fc48ddaec468c057f9ff62c20fad26119d278b6c85-primary.xml.gz
    dc8a69e32b8fbfd2a3d54f6f92ed53561754e3bf68b4263be3e74323a1bb2549-filelists.xml.gz
    repomd.xml
    [root@node2 yum_server]# cat /data/yum_server/repodata/repomd.xml |wc -l
    55
    
    4、通过http协议实现yum的文件传输
    (1) 安装nginx
    yum install nginx
    此步骤要包装本地配置的yum客户端配置指向的启用的yum源,要有nginx安装包,常见的EPEL源和nginx官方自己的
    yum仓库就提供nginx的软件包;
    
    (2) 修改nginx主页指向
    
    vim /etc/nginx/conf.d/default.conf
    默认 root   /usr/share/nginx/html
    改为
    root /data/yum_server
    (3) 设置nginx主页权限和防火墙放行http服务(我没有启用Selinux机制)
    [root@node2 ~]# id nginx
    uid=998(nginx) gid=996(nginx) groups=996(nginx)
    [root@node2 ~]# setfacl -R -m u:nginx:r-- /data/yum_server
    [root@node2 ~]# getfacl /data/yum_server
    getfacl: Removing leading '/' from absolute path names
    # file: data/yum_server
    # owner: root
    # group: root
    user::rwx
    user:nginx:r--
    group::r-x
    mask::r-x
    other::r-x
    [root@node2 ~]# getfacl /data/yum_server/redis-4.0.1.tar.gz 
    getfacl: Removing leading '/' from absolute path names
    # file: data/yum_server/redis-4.0.1.tar.gz
    # owner: root
    # group: root
    user::rw-
    user:nginx:r--
    group::r--
    mask::r--
    other::r--
    [root@node2 yum.repos.d]#  getfacl -p /data/yum_server/redis-4.0.1.tar.gz 
    # file: /data/yum_server/redis-4.0.1.tar.gz
    # owner: root
    # group: root
    user::rw-
    user:nginx:r--
    group::r--
    mask::r--
    other::r--
    
    [root@node2 yum.repos.d]#  getfacl -p /data/yum_server/nginx-1.14.0.tar.gz 
    # file: /data/yum_server/nginx-1.14.0.tar.gz
    # owner: root
    # group: root
    user::rw-
    user:nginx:r--
    group::r--
    mask::r--
    other::r--
    
    Firewalld防火墙放行http:
    [root@node2 yum.repos.d]# firewall-cmd --help|grep add-service
      --add-service=<service>
    [root@node2 yum.repos.d]# firewall-cmd --add-service=http --permanent
    success
    [root@node2 yum.repos.d]# firewall-cmd --reload
    success
    [root@node2 yum.repos.d]# firewall-cmd --list-services
    dhcpv6-client http ssh
    
    (5) 启动nginx,尝试机房访问测试
    [root@node2 ~]# nginx -t 
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
    [root@node2 ~]# systemctl enable nginx.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
    [root@node2 ~]# systemctl start nginx.service
    [root@node2 ~]# ss -nlt|grep :80
    LISTEN     0      128                       *:80                       *:* 
    
    如果是单纯的文件访问没问题,不过要想列出nginx的文件列表,首先nginx的工作进程用户要
    对主页的那个目录有执行权限,其次,对应的站点的配置要添加以下内容:
    autoindex on;  # 开启目录文件列表
    autoindex_exact_size on;  # 显示出文件的确切大小,单位是bytes
    autoindex_localtime on;  # 显示的文件时间为文件的服务器时间
    charset utf-8,gbk;  # 避免中文乱码
    
    给执行权限:
    [root@node2 ~]# setfacl -R -m u:nginx:r-x /data/yum_server
    [root@node2 ~]# getfacl -p /data/yum_server
    # file: /data/yum_server
    # owner: root
    # group: root
    user::rwx
    user:nginx:r-x
    group::r-x
    mask::r-x
    other::r-x
    nginx -t检测语法,成功后,
    systemctl reload nginx.service 重新加载
    
    站点浏览器访问测试![](http://i2.51cto.com/images/blog/201810/28/584f59f82b3f4df557b5f0fae32705a0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
    
    (6)、准备另外一台主机,配置客户端yum源的baseurl指向上面配置的http站点
    
    客户端配置:
    [local-http]
    name=centos7 local http
    baseurl=http://172.168.110.21/
    enable=1
    gpgcheck=0
    
    这里有些凌乱了,我把源码包传到我的yum服务器的软件包目录了,我应该准备rpm包。
    拷贝一些光盘的软件包到我的yum服务端的对应目录。
    [root@node2 yum_server]# cp /media/cdrom/Packages/*.rpm .
    [root@node2 yum_server]# du -sh /data/yum_server/
    3.6G    /data/yum_server/
    重新授权:
    [root@node2 yum_server]# setfacl -R -m u:nginx:r-x /data/yum_server
    软件包加入或变更,要手动更新一下:(更新是非常吃cpu资源的,请不要在有业务的生成环境上测试)
    [root@node2 yum_server]# createrepo --update /data/yum_server
    Spawning worker 0 with 3576 pkgs
    Workers Finished
    Saving Primary metadata
    Saving file lists metadata
    Saving other metadata
    Generating sqlite DBs
    Sqlite DBs complete
    客户端重启构建一下缓存数据:
    [root@node1 yum.repos.d]# yum makecache
    Loaded plugins: fastestmirror
    local-http                                                                                             | 2.9 kB  00:00:00     
    (1/3): local-http/primary_db                                                                           | 2.7 MB  00:00:00     
    (2/3): local-http/filelists_db                                                                         | 2.7 MB  00:00:00     
    (3/3): local-http/other_db                                                                             | 1.1 MB  00:00:00     
    Loading mirror speeds from cached hostfile
    Metadata Cache Created
    
    我之前把系统默认自带的repo都备份了,现在哪台客户端主机只剩下这个配置的http的yum仓库。
    [root@node1 yum.repos.d]# yum repolist
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    repo id                                                 repo name                                                       status
    local-http                                              centos7 local http                                              3,577
    repolist: 3,577
    [root@node1 yum.repos.d]# yum info zsh
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    Available Packages
    Name        : zsh
    Arch        : x86_64
    Version     : 5.0.2
    Release     : 7.el7
    Size        : 2.4 M
    Repo        : local-http
    Summary     : Powerful interactive shell
    URL         : http://zsh.sourceforge.net/
    License     : MIT
    Description : The zsh shell is a command interpreter usable as an interactive login
                : shell and as a shell script command processor.  Zsh resembles the ksh
                : shell (the Korn shell), but includes many enhancements.  Zsh supports
                : command line editing, built-in spelling correction, programmable
                : command completion, shell functions (with autoloading), a history
                : mechanism, and more.
    [root@node1 yum.repos.d]# yum install zsh
    ......
    [root@node1 yum.repos.d]# rpm -q zsh
    zsh-5.0.2-7.el7.x86_64
    经过简单测试后,发现没有问题。
    
    PS:一般构建自己的yum服务器,会去外网同步更新yum仓库的软件包(这台服务器必须要保证出口带宽)。如果
    走外网提供yum文件传输的话,可以这样做,同步外网的软件包,然后对内走内网使用yum仓库。
    比较有名的,CentOS的自己的源,163的源,EPEL的源,阿里云的源等等。

    四、rpm包管理器的前端工具dnf(精简说明)

    默认base仓库没有dnf软件包,需要特殊配置,就连EPEL源也没有,所以我这里只是简单的介绍一下。

    网上google的做法:

    yum -y install wget
    wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-conf-0.6.4-2.sdl7.noarch.rpm
    wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64//dnf-0.6.4-2.sdl7.noarch.rpm
    wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/python-dnf-0.6.4-2.sdl7.noarch.rpm  
    yum -y install python-dnf-0.6.4-2.sdl7.noarch.rpm  dnf-0.6.4-2.sdl7.noarch.rpm dnf-conf-0.6.4-2.sdl7.noarch.rpm 
    
    [root@node2 ~]# yum info dnf
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirrors.163.com
     * epel: mirrors.yun-idc.com
     * extras: mirrors.shu.edu.cn
     * updates: mirrors.163.com
    Installed Packages
    Name        : dnf
    Arch        : noarch
    Version     : 0.6.4
    Release     : 2.sdl7
    Size        : 652 k
    Repo        : installed
    From repo   : /dnf-0.6.4-2.sdl7.noarch
    Summary     : Package manager forked from Yum, using libsolv as a dependency resolver
    URL         : https://github.com/rpm-software-management/dnf
    License     : GPLv2+ and GPLv2 and GPL
    Description : Package manager forked from Yum, using libsolv as a dependency resolver.
    
    dnf是是下一个即将到来的主要版本的yum,它是基于rpm包管理器的linux发型版本的包管理器。(很谦虚)
    它大体上维护了与YUM兼容的CLI,并定义了扩展和插件的严格API。yum相较yum是有有点的,不过目前
    的CentOS 7.x没有采纳进来, Fedora 22 已经默认使用 DNF作为包前端管理器。
    
    dnf语法结构:
    dnf [options] <command> [<args>...]
    Available commands are:
    
    · autoremove
    · check-update
    · clean
    · distro-sync
    · downgrade
    · group
    · help
    · history
    · info
    · install
    · list
    · makecache
    · provides
    · reinstall
    · remove
    · repolist
    · repository-packages
    · search
    · updateinfo
    · upgrade
    · upgrade-to
    
    1、安装和重新安装
    dnf [options] install <spec>...
    dnf [options] reinstall <package-specs>...
    
    2、检测更新和更新
    dnf [options] check-update [<package-specs>...]
    dnf [options] upgrade
    
    3、卸载
    dnf [options] erase <spec>...
    dnf [options] remove <package-specs>...
    
    4、查看repo和软件包以及列表
    dnf [options] repolist [enabled|disabled|all]
    dnf [options] info [<package-spec>...]
    dnf [options] list [all] [<package-name-specs>...]
    dnf [options] list installed [<package-name-specs>...]
    dnf [options] list available [<package-name-specs>...]
    dnf [options] list extras [<package-name-specs>...]
    dnf [options] list obsoletes [<package-name-specs>...]
    dnf [options] list recent [<package-name-specs>...]
    dnf [options] list upgrades [<package-name-specs>...]
    
    5、检索软件包
    dnf [options] search [all] <keywords>...
    
    6、清理缓存和构建缓存
    dnf clean dbcache
    dnf clean expire-cache
    dnf clean metadata
    dnf clean packages
    dnf clean plugins
    dnf clean all
    dnf [options] makecache
    
    等(其他查看软件包的能力,以及包组管理相关,我就不列出来了,也是支持的,和yum几乎差别不大)
    
    展开全文
  • JavaScript包管理器综述

    千次阅读 2016-03-18 09:05:04
    JavaScript包管理器综述作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs对于JavaScript来说,包管理器并不是一个新概念,npm和bower是JavaScript的两个最流行的...

    JavaScript包管理器综述

    作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

    对于JavaScript来说,包管理器并不是一个新概念,npm和bower是JavaScript的两个最流行的包管理器工具,JavaScript的包管理器还有volo、ringojs、component。这些包管理器相比,npm和bower支持的JavaScript库和模块最多。

    volo:http://www.volojs.org/ ,一个基于Node.js的工具,可用于快速创建项目、添加依赖库、自动化常见的任务。

    ringojs:http://ringojs.org/
    Ringo是基于JVM的JavaScript平台,针对服务器端应用进行了优化,用于开发多线程的JavaScript程序。Ringo峰值了大量内建的模块,遵循CommonJS标准。Ringo基于Mozilla的Rhino JavaScript引擎,而Rhino JavaScript引擎是JDK 6以上内嵌的脚本引擎,Ringo在Rhino的基础上进行了增强,主要是多线程编程这部分。
    rp是RingoJS的包管理器,其目标是为本地RingoJS安装提供简易的包管理,以及在远程包注册表中发布包。

    Component:https://github.com/componentjs/component ,这个包管理器项目已经停止维护了。
    Jam:http://jamjs.org/ ,一个JavaScript的包管理器,可以管理依赖、快速载入和模块化,与Bower相似,只管理前端的JavaScript模块。

    webpack:http://webpack.github.io/ ,一款开源的模块加载器兼打包工具,它能把各种资源例如JS(含JSX)、coffee、样式(含less/sass)、图片等都作为模块来使用和处理。

    jspm:http://jspm.io/ ,是基于SystemJS的Javascript包管理器,是基于动态的ES6模块加载器之上构建的工具。

    browserify:http://browserify.org/ ,让开发者使用类似于Node.js的require()方式来组织浏览器端的JavaScript代码,通过预编译让前端JavaScript可以直接使用Node NPM安装的一些库。

    npm主要处理兼容Node.js的JavaScript模块,而Bower聚焦于整个Web平台,可以提供包含模块、脚本、CSS样式表、HTML模板、图片Image、字体的包。故npm主要用于Node.js开发,bower往往工作于客户端。

    npm和bower使用了互不兼容的组织模式,可以在同一个项目中一起使用,它们使用了不同的元数据文件,npm是package.json,bower是bower.json,而且它们把包安装到不同的目录下。通常使用npm管理服务器端的包,使用bower管理客户端的包。

    与Java Maven不同,JavaScript的包管理器主要用于查找包、安装包、管理包的版本。npm除此之外还提供了简单的build相关和test相关的任务。

    使用JavaScript包管理器

    1)在安装bower或npm后,在项目根目录首先应执行

    bower init
    npm init
    

    包管理器会询问一些项目设置相关的问题。一一回答后包管理器就会为项目创建bower.json或package.json配置文档。

    2)要搜索可用的包,执行

    bower search <关键词>
    npm search <关键词>
    

    包管理器会从网络仓库中搜出一堆包列表显示。

    3)要安装包,执行

    bower install <包名>
    npm install <包名>
    

    要安装包的指定版本,命令语法如下:

    bower install <包名>#<包版本>
    npm install <包名>@<包版本>
    

    还可以把项目使用的每一个包的版本信息都保存到项目的元数据文件中,包管理器(包括第三方的包管理器)都可以使用元数据文件来监护客户端的维护、构建、测试和启动任务。

    当然,最佳的方法还是把包的版本信息保存到项目的元数据配置文件中,使用–save选项,命令语法如下:

    bower install --save <包名>#<包版本>
    npm install --save <包名>@<包版本>
    
    展开全文
  • Node之模块与npm包管理器

    千次阅读 2019-12-25 23:54:12
    在Node.js中,提供了一个npm(NodePackageManager)包管理工具。该管理工具可用于从第三方网站上下载Node.js包。在Node.js的官方包网站(网址为https://npmjs.org/)上,我们可以发现许多可通过npm包管理工具进行...

    核心模块与文件模块

    在Node.js中,以模块为单位划分所有功能。核心模块为Node内置模块,还有一些第三方的模块,模块是以js文件或者文件夹的形式存在于node中,每一个模块都是一个js的脚本文件

    如何加载模块

    加载模块只需要用

    require('模块名')
    

    在node中,可以自己编写或者从网上下载以下几种模块文件

    • 后缀名为.js的JavaScript脚本文件。
    • 后缀名为.json的JSON文本文件。
    • 后缀名为.node的经过编译后的二进制模块文件。

    在加载这些模块文件时,需要指定该文件的完整路径及文件名。在指定路径时,可以使用“./”前缀(代表当前目录)来指定相对路径,也可以用“/”前缀来指定绝对路径

    从模块外部访问模块内的成员

    在一个模块文件中定义的本地(即非函数内定义的)变量、函数或对象只在该模块内有效,当你需要从模块外部引用这些变量、函数或对象时,需要在该模块文件内使用exports对象

    示例:

    var myMsg="hello";
    var funcname=function() {
        return 'I'm funcname1 function.';
    };
    exports.msg=myMsg;
    exports.funcname=funcname;
    

    当从外部访问模块时使用require导入即可

    node中模块加载的顺序

    • /home/ry/projects/node_modules/
    • /home/ry/node_modules/
    • /home/node_modules/
    • /node_modules/

    模块对象的属性

    • module.id:属性值为当前模块的ID。在默认情况下,主模块的ID属性值为“.”,其他模块的ID属性值为该模块文件的绝对路径。在模块文件中可以修改当前模块的ID属性值。
    • module.filename:属性值为当前模块文件的文件名。
    • module.loaded:属性值为布尔值,当属性值为false时表示模块尚未加载完毕,属性值为true时表示模块加载完毕。
    • module.parent:属性值为当前模块的父模块对象,即调用当前模块的模块对象。
    • module.children:属性值为一个数组,其中存放了当前模块的所有子模块对象,即当前模块中已加载的所有模块对象。

    Node中的包

    在Node.js中,可以通过包来对一组具有相互依赖关系的模块进行统一管理。通过包的使用,我们可以将某个独立的功能封装起来。一个包事实上是一个目录,其中包含了用于对包进行描述的JSON格式的package.json文件。在一个包中,通常包含如下所示的一些内容:

    • 在包的根目录中存放package.json文件。
    • 在bin子目录中存放二进制文件。
    • 在lib子目录中存放JavaScript文件。
    • 在doc子目录存放对包或包的使用方法进行说明的文档文件。
    • 在test子目录中存放一些对包进行单元测试用的文件。

    在一个package.json文件中,一个package.json文件中通常应该包含的字段及其作用如下所示:

    • name:包名。包名是唯一的,由小写字母、数字和下划线组成,不能含空格。
    • preferglobal:是否支持全局安装。字段值为true时支持全局安装,字段值为false时不支持全局安装。
    • description:包说明。对包进行简要描述
    • version:版本号。
    • author:作者信息数组。每个数组元素中可包含name(作者姓名)字段、email(作者E-mail)字段、web(作者网址)字段。
    • maintainers:包维护者信息数组。每个数组元素中可包含name(包维护者姓名)字段、email(包维护者E-mail)字段、web(包维护者网址)字段。
    • bugs:bug的提交地址,可以是网址或电邮地址。
    • licenses,许可证数组。每个元素要包含type(许可证名称)和url(链接到许可证文本的地址)字段。
    • repository:仓库托管地址数组。每个元素要包含type(仓库的类型,如Git)、url(仓库地址)和path(相对于仓库的路径,可选)字段。
    • keywords,关键字数组,通常用于搜索。
    • dependencies,本包所依赖的包。是一个关联数组,由包名和版本号组成。

    npm包管理工具

    在Node.js中,提供了一个npm(NodePackageManager)包管理工具。该管理工具可用于从第三方网站上下载Node.js包。在Node.js的官方包网站(网址为https://npmjs.org/)上,我们可以发现许多可通过npm包管理工具进行下载的Node.js模块。

    搜索并查看包的信息。

    npm search <packName>
    

    查看官方包仓库中forever包所用package.json文件中的信息。

    npm view <packName>
    

    下载包

    npm install <packName> -g(全局并且加入环境变量)
    

    查看全局包安装路径

    npm root -g
    

    修改全局包的安装路径

    npmconfig set prefix "d:\node"
    

    查看当前目录下所安装的所有包

    npm list -g(全局下的)
    

    卸载包

    npm uninstall <packName> -g(全局并且加入环境变量)
    

    升级包

    npm update -g(全局下的)
    
    展开全文
  • vs里面没有NUGET包管理器的解决办法

    千次阅读 2020-06-16 10:20:39
    1.工具---->>拓展和更新 2.点击图中的联机,在右边输入框中输入uGet Package Manager 3.点击红框部分的下载按钮,并安装 4.关闭vs,重新打开。NUGET包管理器就有了
  • 程序包管理器控制台在哪

    千次阅读 2018-03-19 16:06:26
    在安装有NuGet插件的VS上打开NuGet命令窗口的过程如下:依次选择菜单Tools(工具)-&...Library Package Manager(库程序包管理器)-&gt;Pakcage Manager Console(程序包管理器控制台)...
  • Sublime Text3 package control包管理器工具安装方法如下。 可以通过自动安装或手动安装完成...
  • RubyGems 是 Ruby 的一个包管理器,它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具,它旨在方便地管理 gem 安装的工具,以及用于分发 gem 的服务器。这类似于 Ubuntu 下的apt-get, Centos...
  • Anaconda 包管理器 conda and pip

    万次阅读 2017-04-04 17:32:47
    最近更行了anaconda,发现在自带3.6 python版本的anaconda中,PyQt5 无法正常使用:动态链接库总是没法正常导入;另外,matplotlib.pyplot 也没法正常使用。 所以转向了 winpython,...只是,包管理工具 pip 没法正常
  • 找不到引用?! 找“NuGet程序包管理器

    千次阅读 热门讨论 2017-11-16 10:20:58
    打开菜单栏的“工具”→★→“NuGet包管理器”→★→“程序包管理器控制台”   2.如下图所示,在控制台 PM> 后输入 Install-Package Microsoft.AspNet.Web.Optimization ,按下Enter键即可。...
  • 3.打开 菜单"工具"->"库程序包管理器"->"程序包管理器控制台",然后在VS工作区域的右下方会出现一个”程序包管理器控制台“命令操作台。   4.在命令行状态下,出现命令提示符:PM>,在这里,你就可以输入...
  • VS程序包管理器控制台指令

    千次阅读 2016-12-28 15:12:55
    PM> Update-Package -ProjectName 'CMS.Update(这里是项目名)' -Reinstall Newtonsoft.Json(这里名)
  • Visual Studio的NuGet包管理器无法加载

    千次阅读 2017-11-16 09:35:00
    由于网络原因,虽然地址http://www.nuget.org和https://www.nuget.org/api/v2/在浏览器可以正常打开,但是在VS中使用默认的NuGet程序包源经常加载不出来,此时可以改用另一个源。 ...在VS的选项中,修改或新增程序包源...
  • 问题可能出自于项目经过多次更新,早期的版本没有包管理器,或者其他原因弄丢了 解决方法是: 关闭unity 在项目根目录下的Packages文件夹里的manifest.json里面加一行 "com.unity.package-manager-ui"...
  • Gentoo下折腾emerge包管理器

    千次阅读 2017-04-03 10:59:01
    gentoo:emerge如何使用USE安装额外的扩展,vim如何安装lua支持?
  • 使用包管理器控制台寻找安装NuGet包

    千次阅读 2013-10-11 10:59:42
    此文章介绍怎样使用PowerShell命令行寻找、安装、移出和更新NuGet包。你也能使用管理NuGet包来完成。更多信息,请看使用管理NuGetr对话框 如果你想在不打开解决方案...从工具菜单选中库包管理器(Library Package Mana
  • Fedora之dnf包管理器

    千次阅读 2016-07-22 16:07:27
    1、在配置文件/etc/dnf/dnf.conf中加入: fastestmirror=true keepcache=true 这样下载安装软件就快多了。 2、dnf常用命令 检查并升级可用软件包: $ dnf update 删除缓存: ...$ dnf repolist
  • ArchLinux使用apt/dpkg包管理器

    千次阅读 2018-12-22 16:51:58
    安装yaourt包管理器 # pacman -S yaourt 安装apt/dpkg $ yaourt -S apt 安装apt的同时会安装dpkg,需要单独安装的话 $ yaourt -S dpkg 添加apt源 # echo ...
  • centos 7 通过yum安装dnf 包管理器

    万次阅读 2017-11-04 20:33:17
    From long story众所周知,dnf包管理方式是Fedora18及其以后代替,yum包管理方式的替代品,并且在性能上,得到了很大的优化,此外,Fedora 的自我生态系统 --- Fedora中文社区软件源([中文社区软件源]...
  • VS中程序包管理器控制台的使用

    万次阅读 2015-06-19 09:44:43
    Managing Packages Using the Package Manager Console This topic describes how to find, install, remove, and update NuGet packages using PowerShell commands. You can also work with packages using the M
  • Yocto tips (15): Yocto中的包管理器

    千次阅读 2015-12-22 16:11:16
    使用包管理器 在local.conf中使能即可: 然后编译后就会有rpm包了: 配置文件服务器 可以使用ngix和apache,但是我们也可以只用使用python: python -m SimpleHTTPServer 打开浏览器可以看到: 在机器上面...
  • vs2015使用nuget包管理器安装失败

    千次阅读 2018-07-18 09:44:05
    在使用vs2015安装一些nuget...的错误,按照网上更换nuget源的方式无果后,发现nuget管理器可以更新,更新之后就可以了。更新在“工具”-&gt;“扩展与更新”-&gt;“更新”-&gt;“visual studio库”里。 ...
  • node.js node包管理器--npm

    万次阅读 2016-04-25 09:38:26
    npm(node package manager),是node.js的一个包管理器,用于第三方模块的下载、安装和管理。 npm收录着庞大而丰富的第三方资源,截至目前为止已经收录了220102个包。npm之于node.js,其重要程度可比maven与java...
  • mac的包管理器

    千次阅读 2014-06-06 17:07:20
    Homebrew 是Ruby开发的智能包管理系统,能够判断已有的依赖组件,不用重新下载一套组件,Homebrew 本身是使用Git管理的,升级非常方便. MACPorts 是自成一派,他的所有组件都会安装到/opt/目录下,带来的问题就是很多...
  • Eclipse资源管理器背景色更改

    千次阅读 2017-07-28 11:40:04
    eclipse本身没有提供更改资源管理器背景色的选项,但是我们可以修改plugins文件夹中的css文件来做到。 首先定位到X:\eclipse\plugins\org.eclipse.ui.themes_1.2.0.v20170517-0622文件夹,找到CSS文件夹,打...
  • eclipse左侧栏目即资源管理器怎么打开

    千次阅读 多人点赞 2020-03-27 21:57:53
    有时候不小心点到什么地方了,导致左侧边栏出不来,很是麻烦 用以下方法可以重新开启: ...1.现在我们来打开资源管理器。点击“window”。 2.然后点击“show view”,然后点击“project exporler”。 OK ...
  • 《手把手实现Java图书管理系统》带你从0开始完成毕业设计!附赠源码、文档、数据库脚本等全部资料
  • 微软的winget包管理器

    万次阅读 2020-06-05 14:59:32
    微软的winget包管理器 下载链接
  • XCODE 7.1, Alcatraz, 包管理器
  • npm包管理工具的安装及配置使用

    万次阅读 多人点赞 2018-02-22 12:26:16
    1、什么是npmnpm(Node Package Manager,即:node包管理器)是nodeJS的一个程序包管理和分发的管理工具,npm完全用JavaScript写成,它可以让全世界与Web前端相关开发者共享代码,非常方便的使用各种插件、库和框架...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,891,378
精华内容 1,156,551
关键字:

包管理器