如果使用xlings安装gcc15.1呢, 可以试一试会报同样的错误吗?
xlings install gcc@15.1.0
d2learn开发组
如果使用xlings安装gcc15.1呢, 可以试一试会报同样的错误吗?
xlings install gcc@15.1.0
wsl里和虚拟机里glibc的版本是多少, 这个可能是因素之一
ldd --version
在前段时间开源了一个开发者命令行工具xlings, 收到了一些关注和反馈, 并且最近也对其中的一键安装功能做了进步增强。希望不仅可以帮助初学者快速的搭建编程环境, 也能用于项目开发者来管理复杂项目的开发环境依赖和一键搭建配置支持
下面就从 最小功能实现、递归依赖安装、项目依赖管理循序渐进的介绍一下这个功能的设计和思考
注: 这个软件和功能目前依然处于比较前期的探索和开发中
对于安装一个软件或编程环境大概可以划分成3个步骤: 下载 - 安装 - 配置
并且为了避免重复安装和显示软件的信息, 用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
从对于单一软件或环境接口实现视角来看, 有点类似很多项目中的一键安装/配置脚本
但区别是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安装的时候会自动的递归检查依赖并安装。从单个软件的依赖链来看像一个不严谨的树形结构, 如果绘制所有软件和依赖会是一个依赖图, 并且节点是可以复用的 -- 软件安装复用
很多人在拿到一个不怎么熟悉的项目的时候, 往往要成功的去构建或运行这个项目要花不少时间去解决这个软件或库的依赖问题。所以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的下一步是期望能实现基于场景记忆的版本管理。例如当在一个特定的项目文件夹下 会使用不同的软件版本, 只不过这个还在规划中...
xlings最初是受[Rust社区的rustlings、国内外知名公开课的形式(mit6.1810/d2l/rcore...)]的启发, 加上从学习者和内容创作者(教程开发者)两个方向的思考下。在xmake构建工具的基础上(类似插件的形式)开发的一个项目 - [支持Windows和Linux] - 本文就简单聊一聊 学习者功能介绍、创作者功能介绍、现状和发展
xlings中集成了一些常用的环境/软件的一键安装和配置, 并且支持扩展。这个功能可以帮助编程初学者方便的配置好开发环境和安装相关的软件, 同时也能帮助资深开发者避免常用环境的重复搭建的时间。通过install命令可以查看支持的软件和环境
在install命令后面加上对应的环境和软件xlings就能自动下载相关依赖然后安装并配置
例如安装Python环境
xlings install python
安装vscode
xlings install vscode
xlings中的run功能可以运行一个代码文件, 并且自动检测代码类型和然后使用相关编译器/解释器运行代码。如果没有相关环境xlings会自动安装相关的依赖,后期可能增强这个功能, 例如: 把Python运行中缺少库也自动进行安装
运行C++代码
xlings run main.cpp
运行C和Python代码也是类似run命令后加对应的代码文件
xlings run main.c
xlings run main.py
在这个基础上还有一个动态编译运行的功能, 可以避免多次"修改代码再运行验证"这个重复过程。xlings可以实时的检测代码的变化, 在你修改代码后会自动的重新编译再运行
xlings再代码编译运行的时候接入了大模型错误分析和自定义后端大模型的功能。如果编译程序报错的时候, 大模型可以对报错信息进行分析然后给出对应的提示
从上面AI给出的提示可以看出来, 他来带了一个调皮可爱的风格。这是应该我们可以通过配置文件给大模型设定角色和风格, 如果你把他设置成一个代码练习两年半的抽象艺术家, 那么他就会用抽象风格给你提示。如果你把他设置成一个严肃且脾气暴躁的性格,当代码出错的时他甚至可能会批评你。这个功能可以让编程学习的时候多一点乐趣, 少一点枯燥乏味
本地大模型配置文件示例 - config.llm.xlings
xlings_llm_id = "tongyi"
xlings_llm_key = "sk-xxx"
xlings_llm_system_bg = [[
背景: 你是一个代码专家
任务: 对编译器/解释器输出的错误进行相关内容的提示和建议
输出要求: 用时而可爱、时而傲娇、时而生气的方式回答, 并且每次回答不超过100字
示例:
输入: error:未定义变量。
输出: 哎呀,小变量迷路啦!检查一下变量名是不是写错了呢?🎈
输入: 错误:未定义变量。
输出: 哼,变量都找不到!快去检查你的拼写吧,本天才才不会轻易原谅呢!🌟
输入: Hello World
输出: 哇哦, 程序成功运行了, 点赞!
]]
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就会自动进入下一个练习并打开对应的代码文件
作为一个课程/教程搭建工具, 为了方便课程资源的管理以及学习者获取课程/教程资源。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
目前项目还是属于比较早期的阶段, 有了核心的功能及想法, 但部分功能目前的实现方案还是比较简单或者说是简陋的。例如,像drepo模块, 当前基本还是依赖与git服务, 且没有在线可以预览项目的站点。
发展方向上, 基本算比较清晰的。两个视角: 学习者 和 内容创作者(课程/教程), 从两个方面做一些实际&实用的功能最终达到一个相互作用发展的效果
一个技术知识分享、学习、交流的开源社区。社区以d2learn动手学(从实践出发)为理念和BOOK + CODE + VIDEO + X的结构, 进行各种技术教程、代码实验、课程教学等相关项目的开发。并对这套框架进行抽象和汇总形成了基础工具xlings, 来支撑类d2x项目的快速搭建和管理, 提供:练习代码自动检测、AI智能提示引导、常用技术软件/工具便捷下载、项目模板、项目包管理、Markdown书籍等通用功能
论坛/交流
参与开发和维护
如果你有好的项目想法, 欢迎和社区维护者进行交流讨论哦
![]() ![]() ![]() ![]() ![]() |
---|