当前位置: 首页 > news >正文

做面包有哪些网站知乎下载网站如何做

做面包有哪些网站知乎,下载网站如何做,打开陕西建设厅网站,wordpress 404.3简介#xff1a;目前#xff0c;开发者开发 Serverless Package 的流程相对来说是比较简单的。因为在 Serverless Devs 开发者工具中#xff0c;已经提供了相对完整的脚手架能力#xff0c;一文了解详情~ 作者 | 江昱#xff08;阿里云 Serverless 产品经理#xff09; …简介目前开发者开发 Serverless Package 的流程相对来说是比较简单的。因为在 Serverless Devs 开发者工具中已经提供了相对完整的脚手架能力一文了解详情~ 作者 | 江昱阿里云 Serverless 产品经理 前言 Serverless Devs 一直在以开源代码、开放生态的模式进行建设所以在社区用户参与 Serverless Devs 的建设过程中就会有两条途径 1、参与贡献代码参与代码的贡献相对于来说是有着清晰明确的流程并且也是参与开源项目常见的途径Serverless Devs 的贡献者文档可以参考代码贡献文档 2、参与贡献 Package可以开发应用或者组件发布到 Serverless Registry以供更多人学习、参考或者使用这一部分内容可以参考本文 Serverless Devs Package 介绍 在说什么是 Serverless Devs Packages 之前需要先说一下 Serverless Registry相信很多研发同学都是知道不同语言/生态都有自己的包管理平台例如 Python 语言的 PypiNode.js 的 NPM。 而所谓的包管理平台粗暴来说就是管理 “包” 的这里的 “包”往往指的是别人已经封装了的某些功能或者能力我们可以直接使用而无需我们重复造轮子。 说两个比较形象的例子如果是搞人工智能我们不太现实要手动的来写各种算法往往会通过 SklearnTensorflow 等对应的包来快速的加载某些模型然后在这个基础上再进步的开发和完善。 而在 Serverless 领域我们也希望有一个类似的包管理平台那就是 Serverless Registry Serverless Reigstry Python Pypi Nodejs NPM 存储内容 Serverless packages(包括 Components 和 Application) Python packages Nodejs packages 是否开放标准 是 是 是 官方源 registry.devsapp.cn/simple pypi.python.org registry.npmjs.org 其它源举例 Github registry 、 Gitee registry 清华源 、豆瓣源 tnpm、cnpm 是否支持私有化 支持 支持 支持 配套工具 Serverless Devs 开发者工具 Python包管理工具(pip) Node.js打包管理工具(npm) 配套命令 s pip npm 如何使用 在s.yaml中直接引用 安装之后在代码中引用 安装之后在代码中引用 与 Python 的 PypiNode.js 的 NPM 不同的是在 Serverless Regsitry 中Package 是分成两类的一类是 Component一类是 Application。 针对 Component 和 Application 的通俗来作区分 Component指的是组件类似于一个脚本通过这个脚本可以做一些事情。例如部署一个函数到某个云平台调试某个函数查看某个函数的日志等Application指的是应用类似于一个案例。例如通过某个 Application可以让用户快速的创建一个 Hello World 的应用创建一个音视频处理的应用等 在 Serverless Devs 的规范中有关于二者的一个区别图 而关于 Component 和 Application 的关系是Application 是一个应用案例的定义需要通过 Component 进行部署上线。 或许上面的表示有些许的抽象其实可以用一个形象的案例进行解释。例如 你通过 Python 的 Tensorflow 框架做了一个人脸识别的应用那么此时 Tensorflow 就可以认为是一个 Component而人脸识别的应用就可以认为是一个 Application你通过 Node.js 的 Express、Fs、Path 等依赖做了一个个人博客那么此时 Express、Fs、Path 等依赖就可以认为是不同的 Component而做出来的这个博客就可以认为是一个 ApplicationServerless Registry ModelServerless Package Model 开发 Package 开发者开发 Serverless Package 的流程相对来说是比较简单的。因为在 Serverless Devs 开发者工具中已经提供了相对完整的脚手架能力。 开发者只需要执行s init并且选择Dev Template for Serverless Devs即可: 选择完成不难发现此时会让我们继续选择是开发 Component 还是开发 Application 开发 Component 当选择Component Scaffolding之后需要给即将开发的 Component 起一个名字例如deployfunction 此时可以根据体统提示进入到 Component 的项目目录 此时可以通过 IDE 打开当前项目并通过npm进行依赖安装因为 Serverless Devs 是基于 Typescript 的项目所以组件的开发仅支持 Typescript 和 Node.js 语言 此时可以打开项目中src/index.ts文件不难发现已经存在一个案例 import logger from ./common/logger; import { InputProps } from ./common/entity; export default class ComponentDemo {  /**   * demo 实例   * param inputs   * returns   */  public async test(inputs: InputProps) {    logger.debug(input: ${JSON.stringify(inputs.props)});    logger.info(command test);    return { hello: world };  } } 在该文件中我们不难发现存在一个test(inputs)方法该方法是一个打印inputs参数并返回hello world的案例但是通过这个简单的案例我们可以了解到几个事情 公共方法就是用户可以使用的命令 在项目中我们可以写多个方法对外暴露目前只有一个test但是我们可以增加任何public方法而这些方法将会成为该组件的命令。例如 public async test(inputs: InputProps) {    logger.debug(input: ${JSON.stringify(inputs.props)});    logger.info(command test for test);    return { hello: world };  } public async deploy(inputs: InputProps) {    logger.debug(input: ${JSON.stringify(inputs.props)});    logger.info(command test for deploy);    return { hello: world };  } 此时我们在使用该组件时组件就具备了两个命令test 命令和 deploy 命令为了验证我们的想法我们可以对项目进行基础的开发态的编译npm run watch 此时我们可以找到 example 目录进行 deploy 方法的测试例如 通过 example 下面的 s.yaml 文件我们不难看出这个 yaml 有两个 service分别是 component-test 和 component-test2。 并且这两个 service都用了我们同一个组件。所以在执行s deploy之后获得到预期的结果即执行了 deploy 方法。 同样的我们也可以执行 test 命令看一下效果 要实现的逻辑可以在方法内自由实现 换句话来说Serverless Devs 工具在加载组件的时候实际上就是将对应的参数传递到指定的方法并且执行该方法。所以你要实现什么功能都可以写在对应的方法里。 以 Serverless Registry Component 项目为例我在该项目中存在一个 Login 的功能所以我在 Login 中实现了以下内容 /**     * demo 登陆     * param inputs     * returns     */    public async login(inputs: InputProps) {        const apts {            boolean: [help],            alias: {help: h},        };        const comParse commandParse({args: inputs.args}, apts);        if (comParse.data comParse.data.help) {            help([{                header: Login,                content: Log in to Serverless Registry            }, {                header: Usage,                content: $ s cli registry login options            }, {                header: Options,                optionList: [                    {                        name: token,                        description: [Optional] If you already have a token, you can configure it directly,                        type: String,                    }                ],            }, {                header: Examples without Yaml,                content: [                    $ s cli registry login,                    $ s cli registry login --token my-serverless-registry-token,                ],            },]);            return;        }        const tempToken comParse.data ? comParse.data.token : null        let st 0        let user        if (tempToken) {            const fd await fse.openSync(${getRootHome()}/serverless-devs-platform.dat, w)            await fse.writeSync(fd, tempToken)            await fse.closeSync(fd)            st 1        } else {            const token random({length: 20})            const loginUrl https://github.com/login/oauth/authorize?client_idbeae900546180c7bbdd6redirect_urihttp://registry.devsapp.cn/user/login/github?token${token}            // 输出提醒            logger.warn(Serverless registry no longer provides independent registration function, but will uniformly adopt GitHub authorized login scheme.)            logger.info(The system will attempt to automatically open the browser for authorization......)            try {                await sleep(2000)                opn(loginUrl)            } catch (e) {                logger.info(Failed to open the default address. Please try to open the following URL manually for authorization: )                logger.info(loginUrl)            }            await logger.task(Getting, [                {                    title: Getting login token ...,                    id: get token,                    task: async () {                        for (let i 0; i 100; i) {                            await sleep(2000)                            const tempResult await request(http://registry.devsapp.cn/user/information/github, {                                params: {                                    token: token,                                },                            })                            if (!tempResult.Error tempResult.safety_code) {                                // 或得到结果, 存储状态                                const fd await fse.openSync(${getRootHome()}/serverless-devs-platform.dat, w)                                await fse.writeSync(fd, tempResult.safety_code)                                await fse.closeSync(fd)                                st 1                                user tempResult.login                                break                            }                        }                    },                }            ])        }        if (st 1) {            logger.log(${user ? user : : }Welcome to Serverless Devs Registry., green);        } else {            logger.error(Login failed. Please log in to GitHub account on the pop-up page and authorize it, or try again later.)        }        return null;    } 在该方法中主要存在几个事情 对inputs参数解析获取用户输入的参数内容如果用户输入的参数带有-h或者--help参数则输出对应的帮助信息如果用户输入的参数存在--token则将--token对应的值存入到某个文件中如果用户没有带有--token输入则直接打开浏览器访问 Serverless Registry 的登陆地址并进行相关登陆token的获取 那么同样的方法如果是一个部署函数的方法或者命令我们是不是可以在这个里面实现打包压缩代码然后调用相关创建函数更新函数的接口进行函数的创建呢再比如想要做一个删除函数的方法是不是可以在里面调用删除函数的接口呢 所以可以认为无论想要实现什么功能都可以在对应的方法中实现。 关于开发过程中的一些规范 在上面我们说到Serverless Devs 会带着某些参数调用该方法那么参数是什么样子的格式如何我们该如何解析呢 再比如项目最后的 return 有什么用处如何在项目中获取用户的密钥信息用户在 Yaml 中写的各种参数如何获取用户在执行命令时候传递的参数如何获取 其实这些都可以参考Serverless Devs Package 的开发规范文档的组件模型代码规范在这里我们不难发现 入参 inputs 的结构为 {    command: ,    project: {        projectName: ,        component: ,        provider: ,        access:    },    credentials: {},    prop: {},    args: ,    argsObj: [] } 其中这些参数的含义 目录 含义 command 用户所执行的命令 project 用户的项目基本信息 credentials 用户的密钥信息 prop 用户配置的属性/参数 args 用户传递的参数字符串形式 argsObj 用户传递的参数解析后的以数组形式传递 一个更为具体的例子是在上面的案例代码中有一个 test 方法该方法就是功能实现的方法。此时当用户使用 test 命令时系统就会携带参数调用该方法。以一个真实案例作为举例说明 该组件名为hexo组件核心代码如上所示具备一个 test 方法此时用户侧的 Yaml 为 edition: 1.0.0        #  命令行YAML规范版本遵循语义化版本Semantic Versioning规范 name: FullStack       #  项目名称 access: xxx-account1  #  秘钥别名 services:  HexoComponent:    component: hexo    props:      region: cn-hangzhou      codeUri: ./src 当用户执行s test mytest -a -b abc此时组件代码中的test方法收到的inputs参数实际上是 {    command: test,    project: {        projectName: HexoComponent,        component: hexo,        provider: alibaba,        access: release    },    credentials: {        AccountID: ********,        AccessKeyID: ********,        AccessKeySecret: ********    },    prop: {        Region: cn-hangzhou,        CodeUri: ./src    },    args: mytest -a -b abc,    argsObj: [      mytest, -a, -b, abc    ] } 此时 test 方法会打印日志信息等并返回最终的结果给命令行工具{ hello: world } 而关于如何返回帮助文件如何获取密钥信息如何解析用户的输入内容则可以参考 Serverless Devs 提供的 core 包 在该工具包中我们可以看到诸多的方法助力我们快速的使用 例如获取用户使用密钥就可以直接引入 core 包使用对应的getCredential方法即可 使用方法 1 不传任何参数的时候会获取 default 密钥信息const { getCredential } require(serverless-devs/core);    async function get() {      const c await getCredential();      console.log(c, c);    } 使用方法 2 传参数获取指定的密钥信息const { getCredential } require(serverless-devs/core);    async function get() {      // 组件接收的inputs      const inputs {};      const c await getCredential(inputs, custom, AccountIdByCustom, SecretIDByCustom);      console.log(c, c);    } 组件的描述 在完成我们的组件功能编写之后就可以进行组件的描述所谓的组件的描述就是要告诉 Serverless Registry这是一个什么组件有哪些功能。描述内容在publish.yaml中 关于该文件的内容以及部分参数的取值可以参考组件模型元数据。 当然除了 publish.yaml 之外在 Serverless Package 的规范中目录哪还有其他的文件 |- src # 目录名字可以变更 |   └── 代码目录   |- package.json: 需要定义好main   |- publish.yaml: 项目的资源描述   |- readme.md: 项目简介   |- version.md: 版本更新内容 其中 目录 必须 含义 src 推荐存在 统一放置功能实现当然也可以换成其他的名称或者平铺到项目下但是推荐通过src来做统一的存放 package.json 必须存在 Node.js的package.json需要描述清楚组件的入口文件位置 publish.yaml 必须存在 Serverless Devs Package的开发识别文档 readme.md 必须存在 对该组件的描述或帮助文档信息 version.md 推荐存在 版本的描述例如当前版本的更新内容等 最新版本的规范 0.0.2 版本将会在近期上线和 0.0.1 版本不同的是新版本的 Properties 参数将遵循 JSON Scheme 规范目前可参考 pr#386 开发 Application 当选择Application Scaffolding之后需要给即将开发的 Application 起一个名字例如helloworld Serverless Package 中的 Application 开发相对更为简单无论是任何编程语言无论是任何项目只要可以通过 Serverless Devs 开发者工具进行部署就可以把它包装成为一个应用。 或者更为准确的来表述只要你现在有一个可以通过 Serverless Devs 直接部署的项目那么你就可以 s init 创建一个应用模板把你的那个项目脱敏后直接放在src目录下对应用进行描述例如编辑publish.yaml编辑version.md编辑readme.md等 这一部分具体情况可以参考应用模型文档 特殊格式在应用模型中需要存在src/s.yaml文件作为Serverless Devs识别和使用的资源、行为描述文件在该文件中可能涉及到部分内容是需要用户进行填写的例如用户的密钥名字用户部署业务的地域等。此时可以参考 {{ access }} 直接提醒用户需要输入access这样的一个参数作为Yaml中所必须的参数{{ bucket | alibaba oss bucket }} 直接提醒用户需要输入bucket这样的一个参数作为Yaml中所必须的参数并以|之后的内容alibaba oss bucket作为解释这个参数的含义 例如在某应用的s.yaml中表现为edition: 1.0.0 access: {{ access }} services:  website-starter:   component: devsapp/website    actions:      pre-deploy:        - run: npm install          path: ./        - run: npm run build          path: ./    props:      bucket: {{ bucket | alibaba oss bucket }}      src:        codeUri: ./        publishDir: ./build        index: index.html      region: cn-hangzhou      hosts:        - host: auto 发布 Package 在完成 Serverless Package 的开发之后为了给更多人使用还可以将发布到 Registry 中 发布到 Github/Gitee 关于发布到 Github 或者 Gitee 中方法很简单 创建一个 Repo代码仓库将整个应用或者组件推到该仓库发布一个 Release此时在客户端用户就可以通过s set registry进行registry的切换来使用相对应的功能了。例如我在 Github 的账户为 anycodes我就可以创建一个仓库名字为 demo此时我将我的组件/应用上传到这个仓库中然后发布一个 Release。此时我在客户端将 registry 切换到 Github然后就可以 在使用组件的时候指定组件名为仓库例如 anycodes/demo在初始化应用的时候也可以直接指定应用例如 anycodes/application 发布到 Serverless Registry 若想把 Package 发布到 Serverless Registry可以考虑使用 Serverless Registry Component。 Serverless Registry 的客户端工具也是一个组件所以可以认为 Serverless Registry Component 的这个项目本身也是当前文章的一个最佳实践。 在完成组件或者应用的开发流程之后需要 注册并登录 Serverless Registry实际上就是执行s cli registry login进行组件的发布实际上就是s cli registry publish 当然Serverless Registry Component 这个项目除了登陆和发布之外还有诸多其他的功能例如 查看当前登陆账号发布过的 Package查看某个 Package 的版本信息查看某个 Package 指定版本信息删除某个指定版本的 Package对登陆 token 进行更新 总结 众所周知一个完整的技术架构的发展离不开生态社区对他的赋能无论是 Docker 的 Dockerhub 还是 Python 的 Pypi再或者是 Node.js 的 NPM生态的活跃度和我们开发者的幸福感是正相关的。 我们也非常希望 Serverless Devs 可以通过 Serverless Regsitry 这样一个开放的生态和更多的人一同玩转 Serverless 架构也期待更多优秀的 Package被更为广泛的应用。 原文链接 本文为阿里云原创内容未经允许不得转载。
http://www.yutouwan.com/news/372335/

相关文章:

  • ui网站一般建好大重庆市建设工程信息网官网福海玻璃
  • 上海人才中心网站学做软件的网站有哪些内容
  • 做标签的网站广州美快软件开发有限公司
  • 石景山做网站电商网站做互联网金融
  • 绍兴网站开发廊坊百度推广代运营
  • 手机网站建设必要性网站开发哈尔滨网站开发公司
  • wordpress做网站怎么样怎么样建设企业网站
  • 凡科网站为什么免费做网站滑县网站建设哪家便宜
  • 河南住房与城乡建设厅网站网站开发的高级阶段包括
  • 哪个网站可以做分期wordpress建社群
  • 网站开发的设计思路药品行业做网站
  • 兰州市网站wordpress跟换域名图片不显示
  • 电子商务网站建设期末个人做游戏网站
  • 做网站公司选择哪家好网络优化的工作内容有哪些
  • 做告状网站单屏网站设计
  • 甘肃省住房和城乡建设部网站潍坊做网站的那家好
  • 学生网页设计成品网站怎样在百度上免费做广告
  • 介绍一个电影的网站模板西安的推广公司
  • 盐城网站优化价格广州公司的网页怎么做的
  • 金顶街网站建设网站空间续费一年多少钱
  • 天津公司网站如何制作海淀网站建设本溪
  • 制作公司网站要多少钱策划推广
  • 如花建站dw如何制作网页
  • 广州网站优化排名推广食品网站架构
  • 陕西省建设网站 五大员过期专业的建设企业网站公司
  • wordpress 登录后台乱码网站建设优化服务报价
  • 那种网站后台最好建网站来做什么
  • 网站建设好的图片购物网站如何推广
  • 山西省大同市网站建设公司wordpress顶部是什么
  • 网站建设费与网络维护费区别各大网站搜索引擎入口