“多团队大规模”开发模式 - 基于SAP HANA平台的多团队产品研发
应用SAP HANA “官方”开发模式的伙伴们在转到“多团队大规模”开发模式时会遇到各式各样的心理不适应的状况,各种纠结。比如GIT Repository和HANA Repository冲突什么的。
这些问题主要是思路没有完全转换过来,两种开发模式在不断的“打架”。做一个简单的开发模式映射这样大家或许比较容易去接受“多团队大规模”的开发模式。这个映射不一定完全正确,主要是帮助大家理解。
伙伴们想一想平常我们做JAVA或者.NET项目是怎么做的?一般情况是使用各种框架写JAVA/.NET的代码,然后用ORM映射数据库。写SQL Query时基本上都是在SQL里面去写,去测试然后拼接到自己的JAVA/.NET代码中。
+
那么我们在SAP HANA平台上开发同样可以学习这样的模式,当然这种模式可能比“官方”模式厚重点,但是好处也是显而易见的,比如前文提到的那些好处。前后端的开发都可以在Eclipse中,HANA Studio的作用完全等同拼写检查SQL Query等SQL层面的工作。这样我们在开发过程中就可以应用很多手段,方便的传递参数。比如替换rootpackage,通过maven的插件就很容易的可以做到。这样HANA Instance就扮演了一个编译器的作用。前端的代码编译好之后,和后端代码整合到一起Activate到HANA Repository中,这时的Activate就像是compile一样。Maven的插件,或者Ant的脚本把Activate这些HANA特有的动作都封装起来,开发人员完全还是遵循着传统多团队大规模开发的模式——写代码,编译,调试等。
+
由于Maven涉及到公司内部提供的插件,没有开源。所以就提供一个Ant的脚本以饷读者。
<project name="regi" basedir=".">
<description>Regi wrapper</description> <!-- Properties for using REGI -->
<property name="userstore.key" value="BUILD"/>
<property name="userstore.cmdline" value="${client.dir}/hdbuserstore"/>
<property name="regi.cmdline" value="${client.dir}/regi"/>
<property name="regi.connection.args" value="--key=BUILD" /> <macrodef name="regi">
<attribute name="workspacedir" />
<attribute name="command" /> <sequential>
<!-- make sure the directory exists -->
<mkdir dir="@{workspacedir}" /> <!-- Create the workspace -->
<exec executable="${regi.cmdline}" dir="@{workspacedir}" failonerror="true">
<arg line="@{command}" />
</exec>
</sequential>
</macrodef> <macrodef name="regi_apply">
<attribute name="workspacedir" />
<attribute name="command" />
<element name="files" /> <sequential>
<!-- make sure the directory exists -->
<mkdir dir="@{workspacedir}" /> <!-- Create the workspace -->
<apply executable="${regi.cmdline}" dir="@{workspacedir}" failonerror="true" relative="true" parallel="true">
<arg line="@{command}" />
<files />
</apply>
</sequential>
</macrodef> <macrodef name="regi_setupuserstore">
<attribute name="workspacedir" />
<sequential>
<!-- Setup a key in the user store for use by REGI -->
<exec executable="${userstore.cmdline}" dir="@{workspacedir}" failonerror="true">
<arg line="SET ${userstore.key} ${hana.host} ${hana.user} ${hana.password}" />
</exec>
</sequential>
</macrodef> <macrodef name="regi_createworkspace">
<attribute name="workspacedir" /> <sequential>
<!-- make sure the directory exists (needed for keystore operation) -->
<mkdir dir="@{workspacedir}" /> <!-- Create the workspace -->
<mkdir dir="@{workspacedir}" />
<exec executable="${regi.cmdline}" dir="@{workspacedir}" failonerror="true">
<arg line="${regi.connection.args} create workspace --force" />
</exec>
</sequential>
</macrodef> <macrodef name="regi_export">
<attribute name="workspacedir" />
<attribute name="deliveryUnit" default="" />
<attribute name="vendor" default="" />
<attribute name="fileName" default="" /> <sequential>
<!-- Export the desired delivery unit to the specified file -->
<regi workspacedir="@{workspacedir}" command="export @{deliveryUnit} @{vendor} @{fileName}" />
</sequential>
</macrodef> <macrodef name="regi_track">
<attribute name="workspacedir" />
<attribute name="package" default="" /> <sequential>
<echo>regi track @{package}</echo> <!-- Track the desired package -->
<regi workspacedir="@{workspacedir}" command="track @{package}" />
</sequential>
</macrodef> <macrodef name="regi_commit">
<attribute name="workspacedir" /> <sequential>
<regi workspacedir="@{workspacedir}" command="commit" />
<regi workspacedir="@{workspacedir}" command="activate" />
</sequential>
</macrodef> <macrodef name="regi_import">
<attribute name="workspacedir" />
<attribute name="import" /> <sequential>
<regi workspacedir="@{workspacedir}" command="import @{import}" />
</sequential>
</macrodef> <macrodef name="regi_cleanpackage">
<attribute name="package"/> <sequential>
<echo message="Deleting regi package: @{package}" /> <!-- Brutally crush any and all evidence of the repo objects for the passed package -->
<hdbsqlsql failonerror="false" sql="
delete from "_SYS_REPO"."ACTIVE_OBJECT" where PACKAGE_ID = '@{package}' OR PACKAGE_ID LIKE '@{package}.%' ${line.separator}
delete from "_SYS_REPO"."OBJECT_HISTORY" where PACKAGE_ID = '@{package}' OR PACKAGE_ID LIKE '@{package}.%' ${line.separator}
delete from "_SYS_REPO"."RUNTIME_OBJECTS" where PACKAGE_ID = '@{package}' OR PACKAGE_ID LIKE '@{package}.%' ${line.separator}
delete from "_SYS_REPO"."PACKAGE_CATALOG" where PACKAGE_ID = '@{package}' OR PACKAGE_ID LIKE '@{package}.%' ${line.separator}
delete from "_SYS_REPO"."INACTIVE_OBJECT" where PACKAGE_ID = '@{package}' OR PACKAGE_ID LIKE '@{package}.%' ${line.separator}
delete from "_SYS_REPO"."ACTIVE_OBJECTCROSSREF" where FROM_PACKAGE_ID = '@{package}' OR FROM_PACKAGE_ID LIKE '@{package}.%' ${line.separator}
delete from "_SYS_REPO"."ACTIVE_OBJECTCROSSREF" where TO_PACKAGE_ID = '@{package}' OR TO_PACKAGE_ID LIKE '@{package}.%' ${line.separator}
delete from "_SYS_REPO"."INACTIVE_OBJECTCROSSREF" where FROM_PACKAGE_ID = '@{package}' OR FROM_PACKAGE_ID LIKE '@{package}.%' ${line.separator}
delete from "_SYS_REPO"."INACTIVE_OBJECTCROSSREF" where TO_PACKAGE_ID = '@{package}' OR TO_PACKAGE_ID LIKE '@{package}.%' ${line.separator}
"/>
</sequential>
</macrodef> <macrodef name="regi_clean">
<attribute name="workspacedir" /> <sequential>
<delete dir="@{workspacedir}/._SYS_REGI_settings"/>
</sequential>
</macrodef> <macrodef name="regi_checkout_trackedPackages">
<attribute name="workspacedir" /> <sequential>
<echo>regi checkout trackedPackages --force</echo>
<echo>workspacedir=@{workspacedir}</echo> <!-- Checkout all packages that have been tracked. -->
<regi workspacedir="@{workspacedir}" command="checkout trackedPackages --force" />
</sequential>
</macrodef> <macrodef name="regi_delete_packages">
<attribute name="workspacedir" />
<attribute name="packages" /> <sequential>
<echo>regi delete packages @{packages}</echo>
<echo>workspacedir=@{workspacedir}</echo> <!-- Delete the desired package -->
<regi workspacedir="@{workspacedir}" command="delete packages @{packages}" />
</sequential>
</macrodef> </project>
“多团队大规模”开发模式 - 基于SAP HANA平台的多团队产品研发的更多相关文章
- SAP HANA 开发模式 - 基于SAP HANA平台的多团队产品研发
“基本”开发模式 Windows: Unix/Linux: 在基本模式下我们可以通过regi来进行激活我们的object.Regi是一个类git功能的,方便和HANA repository交互的一个命 ...
- SAP HANA开发中常见问题- 基于SAP HANA平台的多团队产品研发
大家都知道SAP HANA项目打包成Delivery Unit(缩写为DU).依照"官方"的开发模式,特别是整个团队仅仅使用一个HANA Instance进行项目开发,因为HANA ...
- 基于SAP HANA平台的多团队产品研发
工欲善其事必先利其器.要提高多团队的开发效率,而且还是在SAP HANA平台上,建议大家还是本着“慢就是快”的原则,不要急功近利,在没有准备好团队开发的架构时就匆忙开始功能的开发.匆忙功能开发就算了, ...
- 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具
认识Web.桌面和移动app新开发模式 - 基于Node.js环境和VS Code工具 一.开发环境的搭建(基于win10) 1.安装node.js和npm 到node.js官网下载安装包(包含npm ...
- 【公众号系列】SAP HANA 平台的优势
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP HANA 平台的优势 ...
- 小团队git开发模式
实验室要使用Git进行代码管理,但是git非常复杂,各种开发模式也是层出不穷.作为新手的偶们很是发囧啊!!网上搜了一下,发现很多并不适合我们小团队运作(它本身就是为Linux内核管理而开发的分布式代码 ...
- 团队软件开发_基于windows下截屏软件关于NABC框架的特点
经过我们小组数次的激烈讨论,就自己的能力和时间而言,我们小组的初步的计划是开发一款基于windows下的截图软件. 关于这个软件的功能,我们初步的想法如下: 1.能在windows下后台运行,有相应的 ...
- 如何在云端部署SAP HANA实战, Azure 上的 SAP HANA(大型实例)概述和体系结构
什么是 Azure 上的 SAP HANA(大型实例)? Azure 上的 SAP HANA(大型实例)是一种针对 Azure 的独特解决方案. 除了提供 Azure 虚拟机以用于部署和运行 SAP ...
- 【DevOps】团队敏捷开发系列--开山篇
随着软件发布迭代的频率越来越高,传统的「瀑布型」(开发-测试-发布)模式已经不能满足快速交付的需求.2009 年左右 DevOps 应运而生,开发运维一体化,通过自动化工具与流程让整个软件开发构建.测 ...
随机推荐
- Android Studio官方文档: 如何在你的设备上运行你的程序
在实体设备上运行您的应用 设置您的设备,如下所示: 使用一根 USB 电缆将您的设备连接到您的开发机器. 如果您是在 Windows 上开发,可能需要为您的设备安装相应的 USB 驱动程序.如需帮助安 ...
- React Native细节记录
1.环境搭建部分 安装完node后建议设置npm镜像以加速后面的过程(或使用***工具).注意:不要使用cnpm!cnpm安装的模块路径比较奇怪,packager不能正常识别! npm config ...
- Objective-C 数据类型 (一)
数据类型分为三类:基本数据类型,对象类型,id类型. 基本数据类型:int ,float double char 对象类型:类,指针对象,协议 id类型:可以表示对象类型(在表示对象类型的时候 不需要 ...
- JSP页面中taglib的uri设置
今天遇到这样一个问题,使用JAVA做了个WEB应用,其中用到一个自定义标签.该标签的class文件与tld(tld文件中,uri定义为:http://wallimn.iteye.com/myfuncs ...
- spring-boot-starter-parent 1.3.6.RELEASE
2016-11-17 23:43:17.979 DEBUG 3944 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Creating share ...
- 简单的JAVA MVC框架模式--Java-servlet-JavaBean
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...
- WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形
原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...
- 机器学习: Tensor Flow with CNN 做表情识别
我们利用 TensorFlow 构造 CNN 做表情识别,我们用的是FER-2013 这个数据库, 这个数据库一共有 35887 张人脸图像,这里只是做一个简单到仿真实验,为了计算方便,我们用其中到 ...
- 帕斯瓦尔定理(Parseval's theorem)
∫∞−∞|x(t)|2dt=12π∫∞−∞|X(ω)|2dω=∫∞−∞|X(2πf)|2df∑n=−∞∞|x[n]|2=12π∫π−π|X(eiϕ)|2dϕ∑n=0N−1|x[n]|2=1N∑k=0N ...
- crawler_正则表达式零宽断言
在使用正则表达式时,有时我们需要捕获的内容前后必须是特定内容,但又不捕获这些特定内容的时候,零宽断言就起到作用了. (?=exp):零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp. ...