通用
导入API接口定义:cds import
数据库
编译CDS模型为不同格式的输出:cds compile
部署至SQLite来持久化数据:cds deploy --to sqlite
添加HANA的配置:cds add hana
部署至HANA来持久化数据:cds deploy –-to hana
安全
基于CDS Annotations来生成XSUAA相关的部署配置:cds add xsuaa
更新XSUAA相关的部署配置:cds compile
MTA
根据package.json
生成MTA相关部署配置:cds add mta
Fiori工具
增加前端应用部署相关配置:fiori add deploy-config
cds import
你需要做的第一件事是获取XML文件 (EDM XML,Entity Data Model XML,缩写 EDMX) ,这些文件定义了OData服务包含的实体,以便后续应用程序使用。你可以从SAP API Business Hub获得这些XML文件。
使用 cds import
命令将API接口定义导入你的项目:
cds import srv/<api-definition-file-name>.edmx
这条命令会将你的API接口定义以CSN(Core Schema Notation)的格式加入srv/external
文件夹中,同时拷贝EDMX文件至该文件。你可以看到,CSN文件不过是一个对服务元数据以及所包含实体描述的JSON文件。通过该JSON文件,CDS框架可以以简单且安全的CQL(CDS Query Language)方式调用OData服务。
另外,对于Node.js来说,API将会以外部OData服务的形式被加入package.json
的配置:
"cds": {
"requires": {
"API_BUSINESS_PARTNER": {
"kind": "odata-v2",
"model": "srv/external/API_BUSINESS_PARTNER"
}
}
}
基于上面的配置,可以为其添加destination来连接远端服务:Use Destinations with Node.js. 与此同时,你需要在BTP的Cockpit里面创建一个destination,比如:S4HANA
:
"cds": {
"requires": {
"API_BUSINESS_PARTNER": {
"kind": "odata",
"model": "srv/external/API_BUSINESS_PARTNER",
"[production]": {
"credentials": {
"destination": "S4HANA",
"path": "/sap/opu/odata/sap/API_BUSINESS_PARTNER"
}
}
}
}
}
或者,你可以在.cdsrc.json
文件中设置options和flags参数,以便后续用cds import
导入至项目中。
例如:
{
"import": {
"as": "cds",
"force": true,
"include_namespaces": "sap,c4c"
}
}
在准备好以上配置文件后,你就可以用 cds import <file-name>
命令来导入了。
cds compile
cds compile db/ --to sql
cds compile db/ --to json
cds compile db/ --to yml
...
或者:
cds db/ -2 sql
cds db/ -2 json
cds db/ -2 yml
...
目前支持的输出类型:
- json, yml
- edm, edmx, edmx-v2, edmx-v4, edmx-w4, edmx-x4
- sql, hdbcds, hdbtable
- cdl [beta]
- xsuaa
- openapi
例如: cds compile db/ --to sql
CREATE TABLE sap_ui_riskmanagement_Risks (
createdAt TIMESTAMP_TEXT,
createdBy NVARCHAR(255),
modifiedAt TIMESTAMP_TEXT,
modifiedBy NVARCHAR(255),
ID NVARCHAR(36) NOT NULL,
title NVARCHAR(100),
prio NVARCHAR(5),
descr NVARCHAR(5000),
miti_ID NVARCHAR(36),
impact INTEGER,
criticality INTEGER,
PRIMARY KEY(ID)
);
CREATE TABLE sap_ui_riskmanagement_Mitigations (
createdAt TIMESTAMP_TEXT,
createdBy NVARCHAR(255),
modifiedAt TIMESTAMP_TEXT,
modifiedBy NVARCHAR(255),
ID NVARCHAR(36) NOT NULL,
description NVARCHAR(5000),
owner NVARCHAR(5000),
timeline NVARCHAR(5000),
PRIMARY KEY(ID)
);
cds deploy --to sqlite
初始情况下,CDS使用内存来临时存储数据。除了使用内存,我们还可以使用持久数据库,比如:SQLite。
与默认提供的内存数据库不同的是,我们可以持久化方地将数据存储在本地的文件中,比如./sqlite.db
。这会被记录在package.json
中。
cds deploy --to sqlite
在获得本地数据库文件后,我们可以利用命令行工具sqlite3
来对数据库进行数据查询:
sqlite3 sqlite.db .dump
sqlite3 sqlite.db .tables
cds add hana
如果想要使用HANA作为持久化数据库,我们需要添加一些配置。可以利用以下命令实现一键配置:
cds add hana
在
package.json
文件中,会自动添加dependency和cds requires的配置:
{
...
"dependencies": {
...
"hdb": "^0.19.0"
},
...
"cds": {
"requires": {
...
"db": {
"kind": "hana-cloud"
}
}
}
}
或者,你还可以只针对生产环境做相应的配置:
cds add hana --for production
在
package.json
文件中,会自动添加dependency和cds requires的配置:
{
...
"dependencies": {
...
"hdb": "^0.19.0"
},
...
"cds": {
"requires": {
...
"[production]": {
"db": {
"kind": "hana-cloud"
}
},
"db": {
"kind": "sql"
}
}
}
}
又或者,你还可以做混合模式的配置:
cds add hana --for hybrid
cds deploy –-to hana
初始情况下,CDS使用内存来临时存储数据。除了使用内存,我们还可以使用持久数据库,比如:HANA。cds deploy
命令可以将项目的数据库部分部署至HANA。服务端应用(Node.js或者Java部分)仍然可以本地运行,同时连接到远端的HANA数据库实例,提高开发效率。
cds deploy –-to hana
cds watch
cds deploy –-to hana
命令背后做了以下的事情:
编译项目的数据库构件至根目录下的gen文件夹,以便进一步部署至HANA Cloud实例中
创建一个SAP HANA Schemas & HDI Containers(
hdi-shared
plan)类型的服务实例,来处理HDI容器
在HDI容器中创建来自应用的数据库构件
通过修改
default-env.json
文件将服务实例绑定到本地应用中,配置包括有数据库相关的密钥信息。
或者,在混合模式下:
cds deploy –-to hana --profile hybrid
cds watch --profile hybrid
cds add xsuaa
cds add xsuaa
cds add xsuaa --for production
cds add xsuaa
命令背后做的事情:
添加XSUAA配置到项目的
package.json
文件中
创建XSUAA配置文件
xs-security.json
,并根据CDS annotation自动生成role和scope的定义。
确保在这些annotation发生更改时重新运行
cds compile --to xsuaa
,详见:Authorization guide。
cds compile
确保在这些annotation发生更改时重新运行cds compile --to xsuaa
,详见:Authorization guide。
cds compile srv/ --to xsuaa > xs-security.json
{
"scopes": [
{
"name": "$XSAPPNAME.Admin",
"description": "Admin"
}
],
"role-templates": [
{
"name": "Admin",
"description": "generated",
"scope-references": [
"$XSAPPNAME.Admin"
],
"attribute-references": []
}
]
}
更新后,使用
cf create-service xsuaa application <servicename> -c xs-security.json
命令来重新创建一个带有此配置的XSUAA实例,或者,通过cf update-service <servicename> -c xs-security.json
命令来更新旧实例的配置。
package.json
生成MTA相关部署配置:cds add mta
要想将应用程序部署到SAP BTP的Cloud Foundry环境上,你会用到MTA(Multi-Target Application)的部署方式。这种方式可以提高部署效率,通过配置文件mta.yaml
一次性将所有项目内容部署到平台上,包括:UI前端应用、后端服务、数据库、服务实例创建和绑定等。
利用以下命令来让CAP服务器自动生成mta.yaml
文件。该文件是根据项目中的package.json
文件生成的:
cds add mta
例如:
package.json
:
{
"name": "cpapp",
"version": "1.0.0",
"description": "A simple CAP project.",
"repository": "<Add your repository here>",
"license": "UNLICENSED",
"private": true,
"dependencies": {
"@sap/cds": "^6",
"@sap/xssec": "^3.2.8",
"express": "^4",
"passport": "^0.5.0",
"hdb": "^0.19.0"
},
"devDependencies": {
"@sap/ux-specification": "^1.90.12",
"sqlite3": "^5.0.2"
},
"engines": {
"node": "^16"
},
"scripts": {
"start": "cds run",
"watch-risks": "cds watch --open risks/webapp/index.html#fe-lrop-v4",
"watch-mitigations": "cds watch --open mitigations/webapp/index.html#fe-lrop-v4"
},
"eslintConfig": {
"extends": "eslint:recommended",
"env": {
"es2020": true,
"node": true,
"jest": true,
"mocha": true
},
"globals": {
"SELECT": true,
"INSERT": true,
"UPDATE": true,
"DELETE": true,
"CREATE": true,
"DROP": true,
"CDL": true,
"CQL": true,
"CXL": true,
"cds": true
},
"rules": {
"no-console": "off",
"require-atomic-updates": "off"
}
},
"sapux": [
"app/risks",
"app/mitigations"
],
"cds": {
"requires": {
"[production]": {
"db": {
"kind": "hana-cloud"
},
"auth": {
"kind": "xsuaa"
}
},
"db": {
"kind": "sql"
},
"uaa": {
"kind": "xsuaa",
"credentials": {}
}
}
}
}
生成的
mta.yaml
文件:
---
_schema-version: '3.1'
ID: cpapp
version: 1.0.0
description: "A simple CAP project."
parameters:
enable-parallel-deployments: true
build-parameters:
before-all:
- builder: custom
commands:
- npx -p @sap/cds-dk cds build --production
modules:
- name: cpapp-srv
type: nodejs
path: gen/srv
parameters:
buildpack: nodejs_buildpack
build-parameters:
builder: npm-ci
provides:
- name: srv-api # required by consumers of CAP services (e.g. approuter)
properties:
srv-url: ${default-url}
requires:
- name: cpapp-db
- name: cpapp-auth
- name: cpapp-db-deployer
type: hdb
path: gen/db
parameters:
buildpack: nodejs_buildpack
requires:
- name: cpapp-db
resources:
- name: cpapp-db
type: com.sap.xs.hdi-container
parameters:
service: hana
service-plan: hdi-shared
- name: cpapp-auth
type: org.cloudfoundry.managed-service
parameters:
service: xsuaa
service-plan: application
path: ./xs-security.json
config:
xsappname: cpapp-${org}-${space}
tenant-mode: dedicated
mta.yaml
文件主要由module(Cloud Foundry应用)和resource组成(Cloud Foundry服务):
modules
cpapp-srv
- OData服务
cpapp-db-deployer
- 负责部署CAP schema和data(CSV文件)到数据库中
resources
根据
package.json
文件中的cds requires生成。
cpapp-db
- SAP HANA数据库HDI容器实例
cpapp-uaa
- XSUAA服务实例
这些资源是在MTA部署过程中自动创建和更新的Cloud Foundry服务实例。
fiori add deploy-config
npm install --global @sap/ux-ui5-tooling
npm install --global @sap/generator-fiori
cd app/<appname>
fiori add deploy-config cf
例如:
mta.yaml
:
_schema-version: "3.1"
ID: sfsf-projman
description: A simple CAP project.
version: 1.0.0
modules:
- name: sfsf-projman-srv
type: nodejs
path: gen/srv
requires:
- name: sfsf-projman-db
- name: sfsf-projman_html_repo_host
- name: sfsf-projman-destination-service
provides:
- name: srv-api
properties:
srv-url: ${default-url}
parameters:
buildpack: nodejs_buildpack
build-parameters:
builder: npm-ci
- name: sfsf-projman-db-deployer
type: hdb
path: gen/db
requires:
- name: sfsf-projman-db
parameters:
buildpack: nodejs_buildpack
- name: sfsf-projman-destination-content
type: com.sap.application.content
requires:
- name: sfsf-projman-destination-service
parameters:
content-target: true
- name: sfsf-projman_html_repo_host
parameters:
service-key:
name: sfsf-projman_html_repo_host-key
- name: uaa_sfsf-projman
parameters:
service-key:
name: uaa_sfsf-projman-key
parameters:
content:
instance:
destinations:
- Name: sfsf_projman_tia_sfsf_projman_html_repo_host
ServiceInstanceName: sfsf-projman-html5-app-host-service
ServiceKeyName: sfsf-projman_html_repo_host-key
sap.cloud.service: sfsf-projman-tia
- Authentication: OAuth2UserTokenExchange
Name: sfsf_projman_tia_uaa_sfsf_projman
ServiceInstanceName: sfsf-projman-xsuaa-service
ServiceKeyName: uaa_sfsf-projman-key
sap.cloud.service: sfsf-projman-tia
existing_destinations_policy: ignore
build-parameters:
no-source: true
resources:
- name: sfsf-projman-db
type: com.sap.xs.hdi-container
parameters:
service: hana
service-plan: hdi-shared
- name: sfsf-projman-destination-service
type: org.cloudfoundry.managed-service
parameters:
config:
HTML5Runtime_enabled: true
version: 1.0.0
service: destination
service-name: sfsf-projman-destination-service
service-plan: lite
- name: sfsf-projman_html_repo_host
type: org.cloudfoundry.managed-service
parameters:
service: html5-apps-repo
service-name: sfsf-projman-html5-app-host-service
service-plan: app-host
- name: uaa_sfsf-projman
type: org.cloudfoundry.managed-service
parameters:
path: ./xs-security.json
service: xsuaa
service-name: sfsf-projman-xsuaa-service
service-plan: application
parameters:
enable-parallel-deployments: true
build-parameters:
before-all:
- builder: custom
commands:
- npx -p @sap/cds-dk cds build --production
在
mta.yaml
文件中, 将会生成两个与SAP Fiori应用相关的module:
- name: sfsf-projman-app-content
type: com.sap.application.content
path: .
requires:
- name: sfsf-projman_html_repo_host
parameters:
content-target: true
build-parameters:
build-result: resources
requires:
- artifacts:
- sfsfprojmansfsfprojman.zip
name: sfsfprojmansfsfprojman
target-path: resources/
- name: sfsfprojmansfsfprojman
type: html5
path: app/sfsf-projman
build-parameters:
build-result: dist
builder: custom
commands:
- npm install
- npm run build:cf
supported-platforms: []
在
mta.yaml
文件中,自动为destination实例生成parameters和requires的配置:
- name: sfsf-projman-destination-service
type: org.cloudfoundry.managed-service
parameters:
config:
HTML5Runtime_enabled: true
init_data:
instance:
destinations:
- Authentication: NoAuthentication
Name: ui5
ProxyType: Internet
Type: HTTP
URL: https://ui5.sap.com
- Authentication: NoAuthentication
HTML5.DynamicDestination: true
HTML5.ForwardAuthToken: true
Name: sfsf-projman-srv-api
ProxyType: Internet
Type: HTTP
URL: ~{srv-api/srv-url}
existing_destinations_policy: update
version: 1.0.0
service: destination
service-name: sfsf-projman-destination-service
service-plan: lite
requires:
- name: srv-api
xs-app.json
文件被创建,文件包含approuter的路由配置:
{
"welcomeFile": "/index.html",
"authenticationMethod": "route",
"routes": [
{
"source": "^/projman/(.*)$",
"target": "/projman/$1",
"destination": "sfsf-projman-srv-api",
"authenticationType": "xsuaa",
"csrfProtection": false
},
{
"source": "^/resources/(.*)$",
"target": "/resources/$1",
"authenticationType": "none",
"destination": "ui5"
},
{
"source": "^/test-resources/(.*)$",
"target": "/test-resources/$1",
"authenticationType": "none",
"destination": "ui5"
},
{
"source": "^(.*)$",
"target": "$1",
"service": "html5-apps-repo-rt",
"authenticationType": "xsuaa"
}
]
}
ui5-deploy.yaml
文件被创建:
# yaml-language-server: $schema=https://sap.github.io/ui5-tooling/schema/ui5.yaml.json
specVersion: '2.4'
metadata:
name: sfsf.projman.sfsfprojman
type: application
resources:
configuration:
propertiesFileSourceEncoding: UTF-8
builder:
resources:
excludes:
- "/test/**"
- "/localService/**"
customTasks:
- name: webide-extension-task-updateManifestJson
beforeTask: generateManifestBundle
configuration:
appFolder: webapp
destDir: dist
- name: ui5-task-zipper
afterTask: generateCachebusterInfo
configuration:
archiveName: sfsfprojmansfsfprojman
additionalFiles:
- xs-app.json
另外,在
package.json
和manifest.json
文件中,还会生成一些配置.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
17 | |
11 | |
10 | |
10 | |
9 | |
8 | |
7 | |
5 | |
5 | |
5 |