Github CodeSpaces 使用及定制化

Intro

Github 最近推出了很多令人兴奋的新功能,最近使用了 Github CodeSpaces,觉得还是挺不错的,CodeSpaces 相当于自己有了一个云主机,真正实现了云端开发,CodeSpaces 和 Github 做了很好的集成,可以很方便的针对 Github 项目做修改,而且可以根据自己的需要自定义服务器配置和环境,很多开源项目已经集成了 CodeSpaces 的支持,可以很方便的在线开发。

使用示例

我们以 asp.net core 的项目为例,来建一个 Codespaces,ASP.NET Core 已经实现了较好的 Codespaces 支持,我们可以直接使用 Codespaces 来对 ASP.NET Core 的源码进行编译和贡献。

Github 针对 CodeSpaces 提供了支持,在原来克隆仓库的地方多了一个使用 Codespaces 的选项

新建之后,就会开始创建一个容器来运行我们的 codespace

在上面的截图中可以看到,我们也可以在本地的 VSCode 中打开 codespace,这需要我们本地 VSCode 安装一个 Github CodeSpaces 插件即可,但是既然要云端开发在本地打开干嘛呢,还是完全在云端更能体现其优势吧

等待容器构建完成后就会进入到我们的 codespace 中,第一次创建的话会执行一个脚本,执行完成后,我们就可以编译自己想要编译的项目了,这里我选择了一个较小的一个项目 Localization 项目,在 对应的目录下执行 dotnet build 来编译项目,可以看到成功编译通过了

如果你要给微软提 PR,就可以很方便的进行编译测试自己的变更,完全是在云端进行,不需要在本地安装任何环境,而且在创建 Codespace 之后也不需要安装任何环境,在创建 Codespace 的过程中就完成所需环境的安装配置(通常要提 PR 的话,需要先 Fork 原始的项目,在自己 Fork 的项目上创建 Codespace,然后再来修改和提交更新)

再回到 asp.net core 项目之后,我们就可以在 Codespaces 处看到我们刚才创建的 Codespace 了,我们再次打开就不再需要重新创建了,之前做的变更也会保留下来

定制 CodeSpaces

Codespaces 默认的配置会支持绝大多数语言,会安装很多很多环境,针对大多数项目来说是可以拿来即用的,但是对于某一些项目可能支持不太好,比如说,现在默认是没有 .NET 6 的 SDK 的,.NET 6 目前还是预览版,目前默认配置并没有 .NET 6 的环境,如果你的项目是 .NET 6 的,那可能就要自定义 Codespace 的环境了

Codespace 是以容器技术为基础的,运行在微软的 Azure 虚拟机之上的,第一次根据配置创建容器之后会把当前项目克隆下来并根据配置初始化 VS Code,安装必要的插件等

要自定义 Codespace 的配置,有多种方式,整体环境配置就是配置容器,有三种方式,可以直接指定要使用的镜像,也可以提供一个自定义的 Dockerfile 去构建,也可以通过 docker-compose 来创建一个稍微复杂一些的环境

而且我们可以配置 VS Code 需要的插件,还可以暴露端口到公网上

要自定义 Codespace 的配置,我们可以通过在项目根目录下创建一个 .devcontainer 目录,在此目录下创建一个 devcontainer.json 配置所需的配置,具体的配置项目可以参考下面的示例和  VS Code 的文档 <https://code.visualstudio.com/docs/remote/devcontainerjson-reference>

如果不确定配置是不是正确,可以在本地用 VS Code 来测试,需要安装 Remote Container 插件,然后在 Remote Container 中打开项目即可测试了

Samples

Docker-Image

首先我们来看一个最简单的示例,自定义镜像,示例配置如下:

{"image": "mcr.microsoft.com/dotnet/sdk:6.0",// Install needed extensions"extensions": ["ms-dotnettools.csharp","davidanson.vscode-markdownlint"]
}

上面的 image 就是指定我们使用镜像,extensions 是我们 VS Code 中想要安装的插件

Dockerfile

再来看一个 Dockerfile 的示例,在 .devcontainer 目录中添加一个 Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine
RUN apk add git

devcontainer.json

{"name": "CodeSpace","dockerFile": "Dockerfile",// Install needed extensions"extensions": ["ms-dotnettools.csharp","davidanson.vscode-markdownlint"]
}

上面的 dockerFile 就是配置的自定义 Dockerfile(也可以使用 build.dockerfile 来指定 Dockfile, 默认的 Dockerfile 构建时上下文是配置文件所在目录,如果需要可以配置 context 或者 build.context 来配置构建上下文)

Docker-compose

接着我们来看一个 docker-compose 的示例,和 Dockerfile 类似的,我们在 .devcontainer 目录下添加一个 docker-compose.yml 文件

version: '3.7'services:dev-container:image: mcr.microsoft.com/dotnet/sdk:6.0-alpinevolumes:- ..:/workspace:cacheddepends_on:- redislinks:- "redis:redis"environment:- 'App_ConnectionStrings__Redis=redis'   command: /bin/sh -c "while sleep 1000; do :; done"redis:image: redis:6.2-alpine

然后在  devcontainer.json 文件中配置使用 docker-compose

{"name": "CodeSpace","service": "dev-container","dockerComposeFile": [    "docker-compose.yml"],"extensions": ["ms-dotnettools.csharp"]
}

这里项目里依赖 redis,所以在 compose 文件中声明了一个 redis 容器,这样我们在代码里也可以使用这个 redis 来做测试了

Port-forward

我们也可以指定 port-forward,这样就可以通过一个公网域名来访问 codespace 里的服务了,配置示例如下 forwardPorts

{"name": "Codespace","dockerFile": "Dockerfile","forwardPorts": [80, 5000], // [codespace-id]-[port].githubpreview.dev"extensions": ["ms-dotnettools.csharp","davidanson.vscode-markdownlint"]
}

使用 dotnet run 运行项目之后,就可以通过公网访问了

可以看到 5000 端口当前是 active 的,我们就可以通过 5000 端口对应的链接来访问了(如果想要临时添加某一个端口,直接通过上面的 Add Port 来配置就可以了),效果如下:

这样就有了一个公网可以访问的服务了

More

Codespaces 标准化了开发环境,其他人需要编译时不需要再安装这个安装那个,使用同样的环境开发运行就可以了,统一了开发环境,而且基于云端,性能还不错,即使没有电脑在身边,甚至也是可以通过手机来操作的,非常的方便,而且环境都是配置好的,去网吧写个代码还要装环境呢,这下好了,啥环境都不用装了

如果你的开源项目也希望别人功能来参与功能,强烈推荐为你的项目提高较好的 CodeSpaces 贡献体验,现在 ASP.NET Core、 .NET Runtime 、StackExchange.Redis 以及其他很多开源项目已经提供了 CodeSpaces 的支持,上面的示例也是来自于我的几个开源项目配置,可以参考文末的参考链接

目前个人用户有数量限制,如果达到限制了可以删除之前的 Codespace, 所有的 Codespaces 可以在 https://github.com/codespaces 看到

Codespaces 还有很多功能强大的配置就不一一细说了,可以自己去了解一下

References

  • https://github.com/features/codespaces

  • https://docs.github.com/en/codespaces/getting-started/quickstart

  • https://docs.github.com/en/codespaces/getting-started/deep-dive

  • https://code.visualstudio.com/docs/remote/create-dev-container#_use-docker-compose

  • https://github.com/microsoft/vscode-dev-containers

  • https://code.visualstudio.com/docs/remote/devcontainerjson-reference

  • https://www.telerik.com/blogs/introduction-github-codespaces

  • https://github.com/WeihanLi/dotnet-httpie/blob/dev/.devcontainer/devcontainer.json

  • https://github.com/WeihanLi/SparkTodo/tree/master/.devcontainer

  • https://github.com/WeihanLi/WeihanLi.Redis/tree/dev/.devcontainer

  • https://code.visualstudio.com/docs/remote/containers-tutorial

  • https://code.visualstudio.com/docs/remote/containers

  • https://docs.github.com/en/codespaces/customizing-your-codespace/personalizing-codespaces-for-your-account#dotfiles

  • https://github.com/microsoft/vscode-dev-containers/tree/main/containers/codespaces-linux

Github CodeSpaces 使用及定制化相关推荐

  1. 面向隐私AI的TensorFlow深度定制化实践

    作者 | Rosetta团队 出品 | AI科技大本营(ID:rgznai100) 之前我们整体上介绍了基于深度学习框架开发隐私 AI 框架中的工程挑战和可行解决方案.在这一篇文章中,我们进一步结合 ...

  2. 自动化部署必备技能—定制化RPM包[转载]

    回顾下安装软件的三种方式: 1.编译安装软件,优点是可以定制化安装目录.按需开启功能等,缺点是需要查找并实验出适合的编译参数,诸如MySQL之类的软件编译耗时过长.  2.yum安装软件,优点是全自动 ...

  3. SKChoosePopView 一个HUD风格的可定制化选项弹窗的快速解决方案

    原文地址----> MyBlog HUD风格的选项弹窗是我们在日常开发中经常会碰到的一类需求,通常因为项目周期等因素,很少会专门抽出时间来对此类弹窗进行专门的定制开发和维护.常见的情况就是goo ...

  4. Oceanus:美团HTTP流量定制化路由的实践

    背景简述 Oceanus是美团基础架构部研发的统一HTTP服务治理框架,基于Nginx和ngx_lua扩展,主要提供服务注册与发现.动态负载均衡.可视化管理.定制化路由.安全反扒.session ID ...

  5. 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

    作者 | 陈厚道  冯庆 来源 | 阿里巴巴云原生公众号 导读:本文将对 RocketMQ-Exporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQ-Exporter 的实 ...

  6. tensorflow 开始——创建定制化 Estimator(创建自定义评估器)

    参考文章:创建定制化 Estimator 文章目录 创建定制化 Estimator 预制 vs. 定制化 创建功能列 写一个模型函数 定义模型 定义输出层 隐藏层 输出层 实现训练.评估.预测 {#m ...

  7. 怎么通过name配置button_利器 | AppCrawler 自动遍历测试实践(二):定制化配置

    终于到了"啥也不干躺在家就能给社会做贡献"的时候,但有梦想的测试人从不会让自己的生活变得无聊!与其宅在家里数瓜子壳,还不如利用整块时间提升测试开发技能! 定制化配置 自动遍历测试技 ...

  8. .NET Core开发实战(第14课:自定义配置数据源:低成本实现定制化配置方案)--学习笔记...

    14 | 自定义配置数据源:低成本实现定制化配置方案 这一节讲解如何定义自己的数据源,来扩展配置框架 扩展步骤 1.实现 IConfigurationSource 2.实现 IConfiguratio ...

  9. AI应用开发实战系列之四 - 定制化视觉服务的使用

    AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型. 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 h ...

最新文章

  1. 使用Junit4时问题
  2. 关于后端java项目使用SpringBoot框架的报错总结
  3. (已解决)登录火狐浏览器账号后没有同步数据--博主的奇妙寻号之旅
  4. 云计算机教室怎么布线,云和县实验小学计算机教室综合布线及计算机安装预算方案.doc...
  5. 独家:这也许是最具珍藏价值的Oracle DBA生存宝典!
  6. python中的super用法详解_Python中super函数用法实例分析
  7. 挖矿区块链_使用Java语言从零开始创建区块链
  8. java 5 多线程_Java基础系列五、多线程
  9. python猴子吃桃子的问题_非人哉:明星带货却生意惨淡,猴哥心太大,这一帮猴子猴孙不省心...
  10. 移动端页面滚动穿透问题解决方案
  11. SpringCloud学习之Hystrix
  12. C++ 遍历json文件
  13. 学习Java,可以从事哪些岗位?
  14. oracle 11g 重置,oracle数据库重置
  15. Linux timeout命令
  16. 月影无终的伤感日志最新推荐:搁浅的回忆,谁来承受
  17. 电脑C盘空间严重不足,教你5招!电脑内存瞬间多出10个G
  18. js向jsf调用后台方法并传递参数
  19. matlab地球月球卫星关系,Matlab 卫星绕地球旋转演示动画
  20. 刷流量和刷点击率的方法探讨

热门文章

  1. 编程题: 将一个矩阵(二维数组)顺时针旋转90度
  2. 【心情】今天买了ZÈRTZ!
  3. 《WinForm开发系列之高级篇》Item2 TCP异步传输
  4. c#开发-基础知识及有用技巧(一)
  5. 寒假万恶之源3:抓老鼠啊~亏了还是赚了?
  6. 你知道你常用的dos和linux命令吗?
  7. Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)
  8. 6 四大组件之Service
  9. QM课程02-外部功能
  10. JavaScript执行环境 + 变量对象 + 作用域链 + 闭包