P

0

点赞

1

回复

897

浏览

各种语言常见的包管理工具

包管理和构建系统是现代的软件开发团队中必不可少的工具,也是Linux软件系统的常见组织方式。 现代编程语言大多给出了自己专用的包管理和构建系统,那么本文便来总结一下小编用过的那些包管理和构建系统。 JAVASCRIPT 服务器端 Javascript 通常使用 NPM http://npmjs.org/ 作为依赖管理工具。 通过NPM提供的 npm 命令来进行依赖的下载、升级和移除。 通过 package.json 来定义软件包的元信息、开发依赖(开发或测试需要)、部署依赖(运行时需要)。 依赖递归地存储在 node_modules 中。 依赖在项目之间是隔离的,全局安装( g )会使它成为命令行工具而不是全局依赖。 递归的依赖下载风格使得NPM的缓存及其重要。缓存位于 ~/.npm 下,这里保存这 .tgz 格式的包文件。 JavaScript 通常使用 Grunt http://gruntjs.com/ 进行构建。 Grunt通过插件来完成任务,每个插件相当于Makefile的一个命令。 Grunt任务定义在 Gruntfile.js 中。 NPM提供了众多的Grunt插件,当然你也可以手写。 Grunt任务继承了JavaScript的异步特性。 前端 LIB 前端 lib 可以通过 Bower http://bower.io/ 来下载。Bower 不仅可以下载已注册的软件包,还可以下载Github Repo,甚至是一个文件的URL。 通过 bower 命令进行依赖管理。 bower.json 定义了软件包的元信息与依赖。 依赖所在路径可以在 bower.json 中进行设置。 Bower只是一个命令行工具,你需要在正确的路径执行Bower命令。 Bower可以灵活地下载各种依赖,但它的缺点也是明显的:未注册的软件包往往包含冗余的非生产环境的代码,有时甚至需要手动构建。 JAVA Maven https://maven.apache.org/ 是基于项目对象模型(POM)的项目管理工具,通过文本文件来描述项目的版本、URL、License、依赖等信息。 通过 pom.xml 来描述Maven项目。 Maven是项目管理工具,其功能包括依赖管理、软件构建。 Maven通过 .properties 文件和命令行参数读取系统特性。 Ant http://ant.apache.org/ 是由Java写成的编译、测试和部署Java应用的命令行工具。 通过 build.xml 来描述构建过程。 build.xml 的逻辑类似Makefile,每个target由命令和参数构成。 通过命令行参数来读取系统特性。 Gradle https://zh.wikipedia.org/wiki/Gradle 是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。 PYTHON Python的包管理工具能讲一整天的故事:distribute、setuptools、distutils、easy_install、pip、distutils2、packaging、eggs、wheels、pyvenv、virtualenv…… 这也是我为什么讨厌安装python软件的原因,与此同时,旧版本的python2比新的python3更加流行以及两者不兼容也常常给Linux包管理造成麻烦。 现在开始讲故事: 1. distutils是python的标准库; 2. setuptools试图完成distutils缺少的特性而开始开发; 3. easy_install是setuptools的命令行接口,有更多的特性; 4. 在setuptools的开发过程中产生了分歧,于是出现了distribute,它fork自setuptools,并在2013年取得和解并重新merge到setuptools 0.7版本; 5. 相比于上述工具, pip http://pypi.python.org/pypi/pip 是一个更加高阶的接口,pip成为事实上的python软件的安装工具; 6. eggs和wheels成为事实上的二进制python软件的安装工具。 venv 和 virtualenv 则是用来创建python虚拟环境来实现应用隔离的。 venv https://docs.python.org/3/library/venv.html 在python3.3中引入,用于在自己的目录下创建轻量级的虚拟环境,也可以孤立于系统环境。 virtualenv http://virtualenv.readthedocs.org/ 则是一个python软件包,用于创建孤立的python环境。 RUBY Ruby的软件包单元为 RubyGem https://rubygems.org/ 。 Gem由 .gemspec 文件描述。 Gem的构建过程由 Rakefile 描述。 Rake https://rubygems.org/gems/rake 是Gem的构建工具,它与Make类似,用以完成自动化测试和代码生成。 Bundle http://bundler.io/ 则是Ruby的包管理工具,用来跟踪和下载正确版本的Gem。 同时发表在: http://harttle.com/2015/05/29/pkg manager.html http://harttle.com/2015/05/29/pkg manager.html ...

pythonjavarubyjavascript

新建主题 记录代码

学员动态

  • h**u在课程中提出了问题:是的我在英国,只能利...
  • x**3向课程作业中提交了代码
  • x**3在课程作业中回复了老师:这给地方我知道怎么...
  • d**7在课程中提出了问题:老师您看看这个错在哪...
  • w**3回复了d**7在课程中的问题:java 严格要求字...
  • w**3回复了d**7在课程中的问题:代码问题可以直接在代...
  • x**3向课程作业中提交了代码
  • h**u在课程作业中回复了老师:老师你好,在讲义中有...
  • S**n向课程作业中提交了代码
  • 勺**5向课程作业中提交了代码
  • w**3评论了h**u在课程中的作业:可能题目表述不清, ...
  • f**a添加了笔记:Q...
  • l**m向课程作业中提交了代码
  • x**3向课程作业中提交了代码
  • l**n在课程中提出了问题:老师出现这个情况应该...
  • d**7向课程作业中提交了代码
  • l**m评论了:请问什么是doubl...
  • w**3回复了h**u在课程中的问题:那这是太好了,计算机...
  • c**`向课程作业中提交了代码
  • S**n完成了课程的作业
  • f**a添加了笔记:Q1.fo...
  • z**8评论了:Scanner对象可...
  • 天码君回复了F**s在课程中的问题:欢迎来到天码营学习,...
  • S**n完成了课程的作业
  • 勺**5在课程作业中回复了老师:运行没问题,就是提交...
  • z**o向课程作业中提交了代码
  • x**4向课程作业中提交了代码
  • n**0评论了:受益匪浅,学习笔记 ...
  • w**3评论了x**3在课程中的作业:System.out...
  • w**3回复了h**u在课程中的问题:抱歉,视频只放了wi...
  • S**n完成了课程的作业
  • 天码君回复了x**3在课程中的问题:欢迎来到天码营学习,...
  • w**3回复了h**u在课程中的问题:已经在代码上回答你了...
  • 天码君回复了O**e在课程中的问题:欢迎来到天码营学习,...
  • S**n向课程作业中提交了代码
  • d**7在课程中提出了问题:打印出来的HTML必...
  • d**7在课程中提出了问题:public voi...
  • w**z向课程作业中提交了代码
  • w**z向课程作业中提交了代码
  • c**`向课程作业中提交了代码
  • S**n完成了课程的作业
  • w**3评论了z**o在课程中的作业:不是按作业要求实现的...
  • h**u在课程中提出了问题:老师你好,在这个例子...
  • d**7在课程中提出了问题:打印出来的HTML必...
  • z**o在课程作业中回复了老师:请问本地运行能显示如...
  • d**7在课程中提出了问题:您好,为什么错了...
  • h**u在课程中提出了问题:老师你好,在第2课的...
  • w**3评论了h**u在课程中的作业:后面会讲到 循环 。...
  • z**8添加了笔记
  • z**8添加了笔记:Java语言自带的关...
  • d**7向课程作业中提交了代码
  • w**3回复了l**n在课程中的问题:你安装的应该是最新版...
  • h**u添加了笔记:初学Java时我们的...
  • c**`向课程作业中提交了代码
  • h**u在课程中提出了问题:老师你好,在第三课的...
  • x**3向课程作业中提交了代码
  • w**3评论了h**u在课程中的作业:根据要求我们知道让我...
  • c**`向课程作业中提交了代码
  • d**7向课程作业中提交了代码
  • j**7向课程作业中提交了代码
  • 天码君回复了j**7在课程中的问题:欢迎来到天码营学习,...
  • S**n完成了课程的作业
  • F**s向课程作业中提交了代码
  • 刘保方向课程作业中提交了代码
  • h**u添加了笔记:每个Java语句都需...
  • h**u在课程作业中回复了老师:老师,请问以上 by...
  • w**3评论了d**7在课程中的作业:不要写死了字符串,题...
  • x**l向课程作业中提交了代码
  • 天码君回复了y**9在课程中的问题:欢迎来到天码营学习,...
  • d**7在课程中提出了问题:老师好,这是我的作业...
  • 勺**5向课程作业中提交了代码
  • w**3评论了x**3在课程中的作业:int id...
  • h**u添加了笔记:Scanner对象可...
  • h**u在课程作业中回复了老师:老师你好,请问怎么强...
  • x**3向课程作业中提交了代码
  • w**3评论了x**3在课程中的作业:post post....
  • d**7向课程作业中提交了代码
  • w**3评论了h**u在课程中的作业:一开始 在定义的时候...
  • d**7在课程中提出了问题:哦,明白了,谢谢老...
  • z**8添加了笔记:注意,将一个整数和字...
  • c**e添加了笔记:用快捷键CTRL+S...
  • 天码君回复了l**n在课程中的问题:欢迎来到天码营学习,...
  • S**n完成了课程的作业
  • h**u在课程中提出了问题:老师你好,请问把最后...
  • 天码君回复了h**u在课程中的问题:欢迎来到天码营学习,...
  • 刘保方向课程作业中提交了代码
  • S**n完成了课程的作业
  • d**7在课程中提出了问题:public voi...
  • f**a添加了笔记:...
  • 天码君回复了坦克在课程中的问题:欢迎来到天码营学习,...
  • w**3回复了h**u在课程中的问题:代码相关的问题,可以...
  • 天码君回复了S**n在课程中的问题:欢迎来到天码营学习,...
  • 刘保方向课程作业中提交了代码
  • 天码君回复了x**l在课程中的问题:欢迎来到天码营学习,...
  • l**m向课程作业中提交了代码
  • S**n完成了课程的作业
  • z**8添加了笔记:=='和'!='作为...
  • f**a向课程作业中提交了代码
  • 天码君回复了J**2在课程中的问题:欢迎来到天码营学习,...
  • d**7在课程中提出了问题:public voi...
反馈意见