- 浏览: 31487 次
- 性别:
- 来自: 天津
最近访客 更多访客>>
最新评论
-
confident_f:
这个链接打不开了,可有其他途径找到这个材料
Spring Security-2.0入门教程 -
阳光晒晒:
看不到把传送门发出来
风雨过后见彩虹
环境无关的环境 Posted width = "1" height = "1" /> 问题: 在某台机器上运行正常的环境, 换到另外一台机器就gp, 或需要很繁琐的从头配置,浪费从几小时到几天不等的时间.
原因, 则通常包括环境的各个部分散落在不同角落, 不是少了这个就是少了那个, 或不同机器上版本不一样;还包括在配置中使用硬编码的绝对路径, 依赖全局环境变量或属性等.
机器环境虽然各有各的不同, 但依然有可能创建一个"环境无关的环境"
1. 使用相对路径代替绝对路径关键是如何获得当前路径, 如何确定根路径, 如何确保目录结构
4. 缺省值 + 用户自定义属性这是创建"环境无关的环境"的核心机制. 无论如何, 环境要在不同机器上部署, 总会需要修改某些配置,以适应宿主机器. 然而前面我们提到, 所有配置都已置入版本控制. 如果我们直接修改, 则每个环境中都会存在未提交的本地修改. 这是我们不希望看到的,因为当我们升级配置并更新到所有部署时, 可能会产生冲突. 这里其实是两个层面的问题:
缺省值当然可以直接定义在脚本或配置文件中.而多数常用的脚本和配置系统都提供了用户定义属性覆盖缺省值的机制. 比如:
有一个很简单的解决办法, 就是把用户自定义属性置入单独的文件,并且不要把它提交到版本控制系统中(一个理由是这一部分相对整个组织来说, 不存在也不需要唯一的官方来源)
前面例子中的 user.properties 就是一个用户自定义属性文件,只存在每个用户自己的机器上, 不在配置库中. 在Windows和Bash脚本中也可以类似处理
参考借鉴
原因, 则通常包括环境的各个部分散落在不同角落, 不是少了这个就是少了那个, 或不同机器上版本不一样;还包括在配置中使用硬编码的绝对路径, 依赖全局环境变量或属性等.
机器环境虽然各有各的不同, 但依然有可能创建一个"环境无关的环境"
1. 使用相对路径代替绝对路径关键是如何获得当前路径, 如何确定根路径, 如何确保目录结构
- Windows和Unix都有内置的环境变量来表示当前路径, 分别是 %cd% 和 $PWD
Windows批处理脚本中, 还可以使用 %~dp0% 获得脚本所在路径; 而在Unix Bash 脚本中, 则可以使用 `pwd`, 即获得 pwd 命令的输出
如果总是需要引用某个根路径的话, 则可以使用环境变量来定义根路径(参见后面的环境变量). 其实相对路径配合固定的目录结构, 大大削减了对显式定义根路径的需求
那么如何保证目录结构是固定的呢? 自然是使用配置管理系统
- 强制使用配置管理可解决固定的目录结构的问题
使用配置管理还可以解决丢三落四的问题
自然也可以解决所用工具版本不一致的问题
- 大型的系统软件如何处理, 比如 JDK, VC++编译器等, 是否也需要置入版本控制; 这个基本不用, 如果对其特定的版本有需求, 可在脚本中加入检查其版本的逻辑, 不满足则提示并退出即可
依赖的大量二进制库如何处理; 如果有必要可使用依赖管理工具如 Maven, Ivy 等, 而用于存放依赖的本地仓库依然应该置入配置管理, 哪怕不用其版本控制功能, 而只是利用其官方来源/备份存档等好处
必须放在特定位置的文件如何处理, 比如某个文件必须放在/etc目录下; 这个文件还是可以放在配置管理下的目录中, 而在/etc下创建符号链接来指向它; 并提供脚本来干这件事.
4. 缺省值 + 用户自定义属性这是创建"环境无关的环境"的核心机制. 无论如何, 环境要在不同机器上部署, 总会需要修改某些配置,以适应宿主机器. 然而前面我们提到, 所有配置都已置入版本控制. 如果我们直接修改, 则每个环境中都会存在未提交的本地修改. 这是我们不希望看到的,因为当我们升级配置并更新到所有部署时, 可能会产生冲突. 这里其实是两个层面的问题:
- 提供一种机制, 当环境与缺省配置不一致时, 允许用户修改 用户修改的文件应避免与官方文件更新的冲突
缺省值当然可以直接定义在脚本或配置文件中.而多数常用的脚本和配置系统都提供了用户定义属性覆盖缺省值的机制. 比如:
- Windows批处理: set path=my_extra_path;%path%
Bash: export PATH=my_extra_path:$PATH
Ant:
<property file="user.properties"/> <!-- user.properties 中可定义任何后面引用到的属性, 以覆盖其缺省值-->
<property name="src.dir" path="${basedir}" /> <!-- 定义"src.dir"的缺省值-->
CruiseControl:
<property name="src.dir" value="http://www.blogjava.net/chelsea/archive/2009/06/04/." /> <!-- 定义"src.dir"的缺省值-->
<property file="user.properties"/> <!-- user.properties 中可定义任何后面引用到的属性, 以覆盖其缺省值-->
注意Ant的属性是只读的, 先入为主. CruiseControl的属性则是后发制人.
有一个很简单的解决办法, 就是把用户自定义属性置入单独的文件,并且不要把它提交到版本控制系统中(一个理由是这一部分相对整个组织来说, 不存在也不需要唯一的官方来源)
前面例子中的 user.properties 就是一个用户自定义属性文件,只存在每个用户自己的机器上, 不在配置库中. 在Windows和Bash脚本中也可以类似处理
- Windows: call user_env.bat
Bash: source ./user_env.sh 或 . ./user_env.sh
参考借鉴
- 至此, 这套东西在不同的机器上部署时, 只要从版本控制系统中check out出来即可使用了. 更进一步, 还可以提供脚本, 即生成器, 自动探测用户的环境, 来生成全套配置, 类似Rails生成应用框架那样.
其实, 这是一个规范性或标准性的问题. Neal Ford 在<<Productive Programmer: 卓有成效的程序员>>中, 用一章的篇幅详述了各种解决方案, 包括配置管理, 符号链接等, 除此之外, 他还建议可以/应该使用虚拟机来统一项目组的开发环境等. 参见<<Productive Programmer: 卓有成效的程序员>>第五章.
另请参阅<<CruiseControl Enterprise 最佳实践 (3) : Configuring CruiseControl the CruiseControl way>>, 是创建环境无关的持续集成环境的实例
发表评论
-
关于调整部分政府性基金有关政策的通知
2019-07-15 20:42 366摘要: 允许抵免的投资是指试点企业当年实际发生的,独立举办或 ... -
我最近的工作
2009-08-21 11:47 7751:浪潮服务器 曙光服务器 尖锐湿疣等关键字的排名 2:淘宝上 ... -
09游记·夏:天边的云
2009-07-21 17:08 764[img=560,309]http://hiphoto ... -
玩轮滑的人们
2009-07-05 17:08 960轮滑之所以深受大众的 ... -
蜜月滇藏游(8)香格里拉-美的绚烂美的妖娆
2009-06-27 17:08 790中国国家地理对于广义的香格里拉定义是:从西藏东南部林芝地区到滇 ... -
印尼的天空很归属。
2009-06-19 17:08 1001在印度尼西亚没有高楼 ... -
Tapestry最新版5.1.0.5教程(二)续
2009-06-14 08:13 893Tapestry最新版5.1.0.5教程(二)续 ... -
spring junit 测试
2009-06-14 08:01 1346spring junit 测试 Poste ... -
TWaver3.0 SVG WebRadar Chart
2009-06-14 07:58 1009TWaver3.0 SVG WebRadar Chart ... -
Duke's Choice Award 2009(译)
2009-06-14 07:55 721Duke's Choice Award 2009(译) ... -
唯美颐和园:中国传统文化的胜景
2009-06-11 17:08 870标帜建筑昆明湖前的万寿山上的佛香阁十六孔桥石栏水景塔昆明湖佛香 ... -
风雨过后见彩虹
2009-06-10 15:51 817~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ... -
RAP的超酷应用系统:CAS PIA
2009-06-09 07:40 916RAP的超酷应用系统:CAS PIA 下面是基于RA ... -
Tapestry最新版5.1.0.5教程(三)
2009-06-06 09:37 1095Tapestry最新版5.1.0.5教程(三) P ... -
Spring Security-2.0入门教程
2009-06-05 07:22 1351Spring Security-2.0入门教程 欢迎 ... -
(Multi-stage Continuous Integration)多阶段持续集成
2009-06-04 06:44 575BlogJava 首页 新随笔 联系 聚合 ... -
Linux批量替换文件内容
2009-06-02 08:23 2149Linux批量替换文件内容 Posted widt ... -
ubuntu 8.10下手动安装vmvare tools
2009-06-02 08:20 1338ubuntu 8.10下手动安装vmvare tools ... -
webservice 视频教程 Spring+xfire 整合
2009-06-02 08:17 4737webservice 视频教程 Spring+xfire 整合 ... -
Tapestry最新版5.1.0.5教程(二)
2009-06-02 07:44 1068Tapestry最新版5.1.0.5教程 ...
相关推荐
在计算机科学领域中,Java是一种广泛使用的编程语言,它以其平台无关性、健壮性和面向对象的特性而闻名。对于初学者来说,正确地配置Java环境是学习旅程的第一步。本文将详细介绍如何配置Java环境,确保读者能够轻松...
Java是一种简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。由于这些特点,Java被广泛应用于企业级应用开发,移动应用开发等多个领域。 Java开发环境的搭建可以分为两...
设备环境(Device Context,简称DC)是Microsoft Windows操作系统中的一个重要概念,主要用于实现设备无关性编程。在Windows编程中,开发人员不能直接访问物理显示硬件(如显示器、打印机等),而是通过DC这个抽象层...
* 在WEB-INF目录中放入web.xml文件,从webapps目录的原有示例应用内复制web.xml文件,再删除无关内容。 * 在tomcat\conf\web.xml文件中找到这样的语句:<init-param> <param-name>listings</param-name> ...
3. 非环境应力筛选:与环境因素无关的故障,如安装不当、仪器故障、操作错误等。 4. 优势频率:功率谱密度曲线上最大值对应的频率。 5. 瞬态故障:需要特定环境应力才能显现的故障。 标准的一般要求规定: 1. 所有...
**WPF分辨率无关性应用详解** 在传统的Windows编程中,开发者通常...总之,WPF的分辨率无关性使得开发者能够创建适应不同屏幕环境的高质量UI,提升了用户体验。理解和掌握这一特性是开发现代跨平台WPF应用的关键步骤。
同时,通过对MMU的抽象,使接口实现与具体的硬件特性无关,保证ReWorks能够顺利移植到其他硬件平台,包括对不具备MMU能力的硬件平台的支持。 ReDe嵌入式软件开发环境是为ReWorks提供的嵌入式软件开发环境,提供了...
Java是一种广泛使用的高级编程语言,它具有平台无关性、面向对象等特点。为了能够在计算机上运行Java程序,我们需要安装两个主要的组件:JDK(Java Development Kit)和JRE(Java Runtime Environment)。 - **JDK*...
4. **CVS客户端配置** (与Java+MySQL配置无关,但相关于协同开发) - **CVS(版本控制系统)**: 用于跟踪代码更改和多人协作的工具,这里提到的是WinCVS客户端。 - **安装WinCVS**: 下载并安装WinCVS,类似于安装...
尽管本案例中提到的错误与配置文件无关,但正确地设置配置文件对于服务器的正常运行至关重要。 - 关键配置项包括监听端口、服务器块(server blocks)等,应根据项目需求进行适当调整。 - **防火墙设置**:有时,...
在计算机科学领域中,Java是一种广泛使用的高级编程语言,因其平台无关性、健壮性和安全性等特点而备受青睐。无论是开发桌面应用、Web应用还是移动应用(尤其是Android应用),Java都占据着重要的地位。为了能够顺利...
环境卫生学是公共卫生领域的重要组成部分,主要研究环境因素对人体健康的影响,以及如何预防和控制环境因素导致的健康问题。以下是对题目中涉及的一些知识点的详细解释: 1. 微量元素的剂量效应曲线:微量元素的...
1. **平台无关性**:针对不同的RTOS(如uC/OS-II和FreeRTOS),设计的仿真环境应能抽象掉硬件的具体细节,实现对多种RTOS的支持,使它们能够在Linux环境下正常运行。 2. **虚拟抽象层**:Linux Virtual Abstract ...