跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组
折叠
品牌标识

D2Learn Forums

d2learn-dev

d2learn开发组

私有

帖子


  • xlings: 跨平台一键安装功能设计与思考 - 多编程环境搭建、工具软件安装、项目依赖管理
    sunrisepeakS sunrisepeak

    在前段时间开源了一个开发者命令行工具xlings, 收到了一些关注和反馈, 并且最近也对其中的一键安装功能做了进步增强。希望不仅可以帮助初学者快速的搭建编程环境, 也能用于项目开发者来管理复杂项目的开发环境依赖和一键搭建配置支持

    下面就从 最小功能实现、递归依赖安装、项目依赖管理循序渐进的介绍一下这个功能的设计和思考

    e39f59bf-5006-4ee1-8d34-8f36104417f2-image.png

    注: 这个软件和功能目前依然处于比较前期的探索和开发中

    一、最小功能实现 - 接口规范

    1.1 接口设计视角

    对于安装一个软件或编程环境大概可以划分成3个步骤: 下载 - 安装 - 配置

    95355e31-b6bd-4402-9253-cdf3a9094bae-image.png

    并且为了避免重复安装和显示软件的信息, 用top-down的思想,大概核心的接口设计如下:

    function support()
    -- ...
    end
    
    function installed()
    -- ...
    end
    
    function install()
    -- ...
    end
    
    function config()
    -- ...
    end
    
    function info()
    -- ...
    end
    

    其中support接口用来标识当前系统是否支持, info接口是用于获取软件的基础信息

    function support()
        return {
            windows = true,
            linux = true,
            macosx = false
        }
    end
    
    function info()
        return {
            name     = "vscode",
            homepage = "https://code.visualstudio.com",
            author   = "https://github.com/microsoft/vscode/graphs/contributors",
            licenses = "MIT",
            github   = "https://github.com/microsoft/vscode",
            docs     = "https://code.visualstudio.com/docs",
            profile  = "Visual Studio Code",
        }
    end
    

    1.2 接口实现视角

    从对于单一软件或环境接口实现视角来看, 有点类似很多项目中的一键安装/配置脚本

    但区别是xlings的安装实现上是符合一个接口规范的, 这样才能为后面的复用提供可能性。并且使用者可以不用关心实现细节, 通过标准接口就可以使用对应的模块。

    function installed()
        return try {
            function()
                if os.host() == "windows" and (os.getenv("USERNAME") or ""):lower() == "administrator" then
                    return os.isfile("C:\\Program Files\\Microsoft VS Code\\Code.exe")
                else
                    -- os.exec("code --version") - windows cmd not support?
                    common.xlings_exec("code --version") -- for windows
                end
                return true
            end, catch {
                function(e)
                    return false
                end
            }
        }
    end
    
    function install()
        print("[xlings]: Installing vscode...")
    
        local url = vscode_url[os.host()]
        -- only windows administrator
        local use_winget_sys = (os.getenv("USERNAME") or ""):lower() == "administrator"
    
        if not os.isfile(vscode_file) and not use_winget_sys then
            common.xlings_download(url, vscode_file)
        end
    
        return try {
            function ()
                if os.host() == "windows" then
                    print("[xlings]: runninng vscode installer, it may take some minutes...")
                    if use_winget_sys then
                        os.exec("winget install vscode --scope machine")
                    else
                        common.xlings_exec(vscode_file .. " /verysilent /suppressmsgboxes /mergetasks=!runcode")
                    end
                elseif os.host() == "linux" then
                    os.exec("sudo dpkg -i " .. vscode_file)
                elseif os.host() == "macosx" then
                    -- TODO: install vscode on macosx
                end
    
                return true
            end, catch {
                function (e)
                    os.tryrm(vscode_file)
                    return false
                end
            }
        }
    end
    

    二、递归安装依赖 - 复用&依赖图

    通过上面的接口规范化后, 实现软件依赖的自动递归安装和复用就相对简单了。只需要再增加一个用于描述依赖的接口

    function deps() -- pnpm
        return {
            windows = {
                "npm"
            },
            linux = {
                "npm"
            },
            macosx = {
                "npm" 
            }
        }
    end
    

    以pnpm的实现为例, 只需要通过依赖描述添加npm, 而不需要关心npm是否安装。当执行pnpm安装的时候会自动的递归检查依赖并安装。从单个软件的依赖链来看像一个不严谨的树形结构, 如果绘制所有软件和依赖会是一个依赖图, 并且节点是可以复用的 -- 软件安装复用

    294e3f7e-3dd6-42a8-b75b-e87a27688abf-image.png

    三、项目依赖管理 - 快速搭建项目开发环境

    很多人在拿到一个不怎么熟悉的项目的时候, 往往要成功的去构建或运行这个项目要花不少时间去解决这个软件或库的依赖问题。所以xlings有了基础软件的安装功能, 就自然而然的想到当把一个项目从github上clone下来的时候能不能通过一行命令就自动配置好开发这个项目所需要的环境

    在有上面的基础后, 就可以通过一个简单的依赖描述文件来描述一个项目依赖。xlings只需要通过加载这个依赖文件, 然后通过解析出依赖项, 按照递归的方式逐个安装,就可以实现一键配置好一个项目的开发环境。

    config.xlings配置文件示例

    xname = "ProjectName"
    xdeps = {
        rust = "",
        python = "3.12",
        vs = "2022",
        nodejs = "",
        vscode = "",
        ...
        -- postprocess cmds
        xppcmds = {
            "cmd1",
            "cmd2",
        }
    }
    

    在配置文件中通过xdeps来描述项目的直接依赖, 并且可以通过其中的xppcmds项来自定义安装项目依赖后的后处理命令

    四、统一的软件版本管理

    目前xlings的下一步是期望能实现基于场景记忆的版本管理。例如当在一个特定的项目文件夹下 会使用不同的软件版本, 只不过这个还在规划中...

    Other

    • xlings论坛
    • xlings开源仓库

  • xlings: 一个用于编程开发、学习和课程搭建的开发者工具 🛠️
    d2learn-devD d2learn-dev

    0.背景

    xlings最初是受[Rust社区的rustlings、国内外知名公开课的形式(mit6.1810/d2l/rcore...)]的启发, 加上从学习者和内容创作者(教程开发者)两个方向的思考下。在xmake构建工具的基础上(类似插件的形式)开发的一个项目 - [支持Windows和Linux] - 本文就简单聊一聊 学习者功能介绍、创作者功能介绍、现状和发展

    d2learn-xlings.0.png

    1.通用功能 - 编程学习

    软件安装和环境搭建

    xlings中集成了一些常用的环境/软件的一键安装和配置, 并且支持扩展。这个功能可以帮助编程初学者方便的配置好开发环境和安装相关的软件, 同时也能帮助资深开发者避免常用环境的重复搭建的时间。通过install命令可以查看支持的软件和环境

    d2learn-xlings.1.png

    在install命令后面加上对应的环境和软件xlings就能自动下载相关依赖然后安装并配置

    例如安装Python环境

    xlings install python
    

    安装vscode

    xlings install vscode
    

    多编程语言支持和实时编译运行

    xlings中的run功能可以运行一个代码文件, 并且自动检测代码类型和然后使用相关编译器/解释器运行代码。如果没有相关环境xlings会自动安装相关的依赖,后期可能增强这个功能, 例如: 把Python运行中缺少库也自动进行安装

    运行C++代码

    xlings run main.cpp
    

    d2learn-xlings.2.png

    运行C和Python代码也是类似run命令后加对应的代码文件

    xlings run main.c
    
    xlings run main.py
    

    在这个基础上还有一个动态编译运行的功能, 可以避免多次"修改代码再运行验证"这个重复过程。xlings可以实时的检测代码的变化, 在你修改代码后会自动的重新编译再运行

    AI代码提示

    xlings再代码编译运行的时候接入了大模型错误分析和自定义后端大模型的功能。如果编译程序报错的时候, 大模型可以对报错信息进行分析然后给出对应的提示

    d2learn-xlings.3.png

    从上面AI给出的提示可以看出来, 他来带了一个调皮可爱的风格。这是应该我们可以通过配置文件给大模型设定角色和风格, 如果你把他设置成一个代码练习两年半的抽象艺术家, 那么他就会用抽象风格给你提示。如果你把他设置成一个严肃且脾气暴躁的性格,当代码出错的时他甚至可能会批评你。这个功能可以让编程学习的时候多一点乐趣, 少一点枯燥乏味

    本地大模型配置文件示例 - config.llm.xlings

    xlings_llm_id = "tongyi"
    xlings_llm_key = "sk-xxx"
    xlings_llm_system_bg = [[
    背景: 你是一个代码专家
    任务: 对编译器/解释器输出的错误进行相关内容的提示和建议
    输出要求: 用时而可爱、时而傲娇、时而生气的方式回答, 并且每次回答不超过100字
    示例:
        输入: error:未定义变量。
        输出: 哎呀,小变量迷路啦!检查一下变量名是不是写错了呢?🎈
        输入: 错误:未定义变量。
        输出: 哼,变量都找不到!快去检查你的拼写吧,本天才才不会轻易原谅呢!🌟
        输入: Hello World
        输出: 哇哦, 程序成功运行了, 点赞!
    ]]
    

    2.课程/教程搭建

    项目基础结构和模板生成

    xlings提供了一个init命令, 结合配置文件可以用来生成一个类[Book + Code + Video + X]结构的教程项目。例如,再本地文件夹中创建一个xlings的配置文件

    config.xlings

    xlings_name = "learn-stl"
    xlings_lang = "cpp"
    

    其中xlings_name是练习代码的名字, xlings_lang是项目使用的语言。然后在配置文件所在的目录运行init命令就可以生成一个基础项目结构

    speak@speak-pc:~/test/xlings/my_project$ xlings init
    -mdbook
    mdbook v0.4.40
    2024-10-29 01:09:37 [INFO] (mdbook::book::init): Creating a new book with stub content
    
    All done, no errors...
    2024-10-29 01:09:37 [INFO] (mdbook::book): Book building has started
    2024-10-29 01:09:37 [WARN] (mdbook::preprocess::cmd): The command wasn't found, is the "foo" preprocessor installed?
    2024-10-29 01:09:37 [WARN] (mdbook::preprocess::cmd): 	Command: mdbook-foo
    2024-10-29 01:09:37 [INFO] (mdbook::book): Running the html backend
    2024-10-29 01:09:37 [INFO] (mdbook): Opening web browser
    [xlings]: ../learn-stl/exercises/cpplings.hpp - ok
    [xlings]: ../learn-stl/tests/cpplings.cpp - ok
    [xlings]: ../learn-stl/xmake.lua - ok
    warning: includes("../learn-stl") cannot find any files!
    speak@speak-pc:~/test/xlings/my_project$ 
    

    项目结构

    .
    ├── book
    │   ├── book.toml
    │   └── src
    │       ├── chapter_1.md
    │       └── SUMMARY.md
    ├── config.xlings
    └── learn-stl
        ├── exercises
        │   └── cpplings.hpp
        ├── tests
        │   └── cpplings.cpp
        └── xmake.lua
    

    book目录: 是用于存放项目的markdown文档, 使用xlings book(调用mdbook)可以把文档在浏览器打开, 也可以部署到Github上作为在线的电子书

    learn-stl目录: 用于存放项目对应的练习代码, 可以被xlings加载识别用于练习代码自动化检测

    config.xlings: 项目的配置文件, 可以在这里添加项目依赖这样xlings能自动安装项目所需要的环境

    练习代码自动化检测

    xlings把练习代码的自动化检测功能从单一教程项目抽象了。这样只要项目按照一定的格式设计练习代码都可以被xlings识别实现自动定位代码文件、实时检测当前练习的状态, 以及练习完成时可以自动跳转到下一个练习等功能。通过运行在对应项目中运行xlings checker或xlings xlings_name就可以加载代码开启练习代码的自动化检测, 例如d2ds动手写数据结构的项目

    xlings dslings # dslings是d2ds项目配置文件中设置的别名
    

    运行效果

    最上面显示练习进度信息和当前练习的状态, 后面就是编译信息以及AI提示。自动检测程序会"实时检测"这个练习, 当你成功完整并通过检测, xlings就会自动进入下一个练习并打开对应的代码文件

    drepo项目管理

    作为一个课程/教程搭建工具, 为了方便课程资源的管理以及学习者获取课程/教程资源。xlings还开发了一个可以发布项目的模块, 这样就能很方便的使用xlings获取对应项目的资源

    speak@speak-pc:~/test$ xlings drepo # 可以列出已经发布的项目
    
    	drepo lists
    
    --- d2python ---
    name	: d2python
    tags	: python
    url	: https://github.com/d2learn/d2python
    git	: git@github.com:d2learn/d2python.git
    profile	: 动手学d2python项目
    --- d2x ---
    name	: d2x
    tags	: template
    url	: https://github.com/d2learn
    git	: git@github.com:d2learn/xlings.git
    profile	: drepo的模板配置文件
    --- xlings ---
    name	: xlings
    tags	: tools, build, auto-exercises, pkg-manager
    url	: https://github.com/d2learn/xlings
    git	: git@github.com:d2learn/xlings.git
    profile	: 技术、实验、练习、自学类项目, 快速构建和管理工具
    --- d2ds ---
    name	: d2ds
    tags	: c++, data-structures
    url	: https://github.com/d2learn/d2ds
    git	: git@github.com:d2learn/d2ds.git
    profile	: 强调动手实践的数据结构学习项目,其中包含在线书籍、公开课、练习代码等子项目
    --- d2cpp ---
    name	: d2cpp
    tags	: c++
    url	: https://github.com/d2learn/d2cpp
    git	: git@github.com:d2learn/d2cpp.git
    profile	: 动手学C++项目
    
    	run xlings drepo [drepo_name] to download
    
    
    

    在xlings drepo后面加上项目名就可以下载对应的项目。例如下载d2ds项目

    xlings drepo d2ds
    

    3.现状和发展

    目前项目还是属于比较早期的阶段, 有了核心的功能及想法, 但部分功能目前的实现方案还是比较简单或者说是简陋的。例如,像drepo模块, 当前基本还是依赖与git服务, 且没有在线可以预览项目的站点。

    发展方向上, 基本算比较清晰的。两个视角: 学习者 和 内容创作者(课程/教程), 从两个方面做一些实际&实用的功能最终达到一个相互作用发展的效果

    4.相关链接

    xlings开源

    d2learn官网

    d2learn论坛


  • D2Learn Opensource - 简介
    sunrisepeakS sunrisepeak

    D2Learn Opensource

    一个技术知识分享、学习、交流的开源社区。社区以d2learn动手学(从实践出发)为理念和BOOK + CODE + VIDEO + X的结构, 进行各种技术教程、代码实验、课程教学等相关项目的开发。并对这套框架进行抽象和汇总形成了基础工具xlings, 来支撑类d2x项目的快速搭建和管理, 提供:练习代码自动检测、AI智能提示引导、常用技术软件/工具便捷下载、项目模板、项目包管理、Markdown书籍等通用功能

    🐕 近期活跃项目

    • xlings : 一个用于技术学习、软件安装、教程教学类项目搭建和管理的基础工具
    • d2ds : 动手学数据结构项目
    • d2python : 动手学Python项目

    👥 参与社区讨论和贡献

    论坛/交流

    • 即时交流群(Q): 167535744
    • 各项目issues: 对应项目的问题/Bug反馈、功能请求
    • d2learn综合社区: 代码/经验分享、社区发展、想法交流等社区相关问题

    参与开发和维护

    • 解答社区中用户的问题
    • 修复项目Bug, 完善项目文档
    • 参与新功能和新模块的开发
    • 创建新的类d2x项目

    如果你有好的项目想法, 欢迎和社区维护者进行交流讨论哦 👋

    🎓 课程主页 - 📄 社区文档 - 👥 社区论坛 - 🐛 issues看板 - 🚀 项目开发看板

成员列表

d2learn-devD d2learn-dev
SPeakS SPeak
sunrisepeakS sunrisepeak
  • 登录

  • 登录或注册以进行搜索。
d2learn forums Powered by NodeBB
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组