
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
https://travis-ci.org/smrealms/smr.svg?branch=master](https://travis-ci.org/smrealms/smr) https://codecov.io/gh/smrealms/smr/branch/master/graph/badge.svg](https://codecov.io/gh/smrealms/smr) https://img.shields.io/docker/build/smrealms/smr.svg](https://cloud.docker.com/swarm/smrealms/repository/docker/smrealms/smr) ,支持Traefik反向代理,并提供phpMyAdmin数据库可视化工具。适用于游戏服务器搭建、开发与运维场景,满足快速部署、版本迭代及开发调试需求。
确保已安装以下软件:
如需在本地运行单元测试:
首先,需克隆此仓库。克隆后,需创建以下文件的特定安装副本:
.env.sample → .envconfig/config.specific.sample.php → config/config.specific.php如需“Caretaker”(IRC)或“Autopilot”(***)功能:
config/irc/config.specific.sample.php → config/irc/config.specific.phpconfig/discord/config.specific.sample.php → config/discord/config.specific.php如需NPC功能:
config/npc/config.specific.sample.php → config/npc/config.specific.php示例文件包含合理默认值,但需根据需要更新副本。各配置文件中的选项必须保持一致。
初始化数据库或使用新补丁更新数据库,运行:
docker-compose run --rm flyway
如需修改数据库,在db/patches中添加名为V<VERSION_NUMBER>__<NAME>.sql的文件,然后重新运行上述命令。
可选择启动https://www.phpmyadmin.net/%EF%BC%8C%E9%80%9A%E8%BF%87%E6%B5%8F%E8%A7%88%E5%99%A8%E5%9C%A8%60http://localhost/pma/%60%E6%9F%A5%E7%9C%8BMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%9A
docker-compose up --build -d pma
启动持久化游戏服务:
docker-compose up --build -d traefik smr
开发环境中,如需无需重建Docker镜像自动应用代码变更,使用smr-dev服务替代smr:
docker-compose up --build -d traefik smr-dev
创建管理员账户需先通过注册表单创建标准账户,然后运行以下命令授予管理员权限:
bashdb/init_admin.sh
登录后,账户左侧将显示“Admin Tools”链接,可通过该链接为自己及其他用户分配额外权限。
需先为自己分配“1.6 Universe Generator”权限,然后通过管理工具访问链接创建游戏。游戏配置完成后,需编辑“game”表,将游戏的“enabled”标志设为'TRUE',使其显示在可加入游戏列表中。
以下为新代码应遵循的编码风格(现有代码可能未完全遵循,规范可能会扩展):
左花括号与语句同一行,之间有一个空格
单行if语句仍需包含花括号
phpif (true) { }
变量名通常使用camelCase,模板中使用UpperCamelCase(以区分两种上下文)
php$applicationVar = 'value'; $TemplateVar = 'value';
函数名使用camelCase,类名使用UpperCamelCase
phpfunction exampleFunction() { } class ExampleClass { public function exampleMethod() { } }
关联数组索引使用UpperCamelCase
php$container['SectorID'] = $sectorID;
使用get_file_loc()包含文件:
phprequire_once(get_file_loc('SmrAlliance.class.php'));
尽可能使用Globals或相关对象的函数生成链接(如Globals::getCurrentSectorHREF()、$otherPlayer->getExamineTraderHREF()),这样更清晰且支持热键系统。创建链接需先使用smr.inc.php中声明的create_container()函数创建“容器”:
phpcreate_container($file, $body = '', array $extra = array(), $remainingPageLoads = null)
常见用法有两种:
调用SmrSession::getNewHREF($container)获取加载指定页面的HREF,或调用SmrSession::generateSN($container)仅获取sn。可给$container分配额外值,在 next页面通过$var访问:
php$container = create_container('sector_move_processing.php'); $container['target_sector'] = 1; $link = SmrSession::getNewHREF($container);
所有页面均有以下可用变量(可能更多):
SmrMySqlDatabase类的全局实例,可用于任何地方的数据库查询,但注意避免同时在两处使用(可能导致数据库错误)。
包含从上一页面通过$container传递的所有信息。可通过SmrSession::updateVar($name, $value)赋值。
Template类的全局实例(唯一实例),用于为显示处理分配变量。
当前SmrAccount对象,不可赋值。
[作用域:游戏中] 当前SmrPlayer对象,不可赋值。
[作用域:游戏中] 当前SmrShip对象,不可赋值。
[作用域:游戏中] 当前SmrSector对象,不可赋值。
任何通过POST或GET接收输入的页面,需使用SmrSession::updateVar()将输入值存储到$var中,并仅通过$var访问。这是因为自动刷新页面时不会重新发送输入,但仍需这些值正确渲染页面。
最初用于NPC的“标准”方式已弃用。现在所有核心/共享“默认”代码应放在抽象类中,普通类作为子类实现游戏类型特定功能/重写,例如“lib/Semi Wars/SmrAccount”用于在半战争游戏中使所有账户显示为“资深”账户。
SMR使用https://phpunit.de/%E8%BF%90%E8%A1%8C%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E3%80%82
composer start:integration-servicescomposer run test执行完整测试套件。/test目录中添加新测试。以下适用于IDEA系IDE(如IntelliJ、PHPStorm)。其他IDE请参考官方文档配置远程容器中的PHPUnit测试。
为项目配置远程PHP解释器
File > Settings > Languages & Frameworks > PHP,在“CLI Interpreter”区域点击“...”按钮/test.env的值/smr/vendor/autoload.php/smr/phpunit.xml创建涉及数据库的集成测试时,测试类应继承SmrTest\BaseIntegrationSpec。这可确保测试后清理数据库。SMR数据库使用MyISAM存储引擎,无法通过事务回滚清理,因此BaseIntegrationSpec会检查启动时通过flyway迁移填充的表,并在测试后截断其他所有表。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务