mcpywrap 0.2.2__tar.gz → 0.2.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mcpywrap-0.2.3/LICENSE +21 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/PKG-INFO +5 -4
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/README.md +2 -2
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/project_builder.py +1 -40
- mcpywrap-0.2.3/mcpywrap/commands/add_cmd.py +69 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/build_cmd.py +4 -1
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/default_cmd.py +4 -1
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/dev_cmd.py +4 -1
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/init_cmd.py +17 -17
- mcpywrap-0.2.3/mcpywrap/commands/remove_cmd.py +69 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/run_cmd.py +4 -1
- mcpywrap-0.2.3/mcpywrap/config.py +281 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/symlinks.py +17 -9
- mcpywrap-0.2.3/mcpywrap/utils/pip_error_parser.py +184 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/utils/project_setup.py +36 -4
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/PKG-INFO +5 -4
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/SOURCES.txt +2 -1
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/requires.txt +0 -1
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/pyproject.toml +1 -2
- mcpywrap-0.2.2/mcpywrap/commands/add_cmd.py +0 -39
- mcpywrap-0.2.2/mcpywrap/commands/remove_cmd.py +0 -42
- mcpywrap-0.2.2/mcpywrap/config.py +0 -143
- mcpywrap-0.2.2/mcpywrap/utils/py3to2_util.py +0 -53
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/__init__.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/__main__.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/AddonsPack.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/MapPack.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/__init__.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/dependency_manager.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/file_merge.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/watcher.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/cli.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/__init__.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/edit_cmd.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/mod_cmd.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/modsdk_cmd.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/publish_cmd.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/ui_cmd.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/custom_packaging.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/SimpleMonitor.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/__init__.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/editor.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/game.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/mcs.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/runtime_cppconfig.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/studio_server.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/studio_server_ui.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/symlink_helper_global.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/symlink_helper_map.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/__init__.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/addons.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/level_dat.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/map.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/netease_modsdk.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/template/generate_mod_files.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/template/mod_template.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/ui/__init__.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/ui/project_ui.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/utils/__init__.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/utils/print_guide.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/utils/utils.py +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/dependency_links.txt +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/entry_points.txt +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/top_level.txt +0 -0
- {mcpywrap-0.2.2 → mcpywrap-0.2.3}/setup.cfg +0 -0
mcpywrap-0.2.3/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 EaseCation®️
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcpywrap
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: A wrapper for Minecraft China Edition Addons management
|
|
5
5
|
Author-email: boybook <boybook@easecation.net>
|
|
6
6
|
License: MIT
|
|
@@ -11,8 +11,8 @@ Classifier: License :: OSI Approved :: MIT License
|
|
|
11
11
|
Classifier: Operating System :: OS Independent
|
|
12
12
|
Requires-Python: >=3.6
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
|
+
License-File: LICENSE
|
|
14
15
|
Requires-Dist: click>=8.0.0
|
|
15
|
-
Requires-Dist: 3to2>=1.1.1
|
|
16
16
|
Requires-Dist: watchdog>=2.0.0
|
|
17
17
|
Requires-Dist: twine>=3.4.0
|
|
18
18
|
Requires-Dist: tomli
|
|
@@ -21,6 +21,7 @@ Requires-Dist: setuptools
|
|
|
21
21
|
Requires-Dist: PyQt5>=5.15.0
|
|
22
22
|
Requires-Dist: psutil>=5.8.0
|
|
23
23
|
Requires-Dist: rich>=10.0.0
|
|
24
|
+
Dynamic: license-file
|
|
24
25
|
|
|
25
26
|
# 🧰 mcpywrap
|
|
26
27
|
|
|
@@ -34,7 +35,7 @@ mcpywrap 是基于 Python 生态的《我的世界》中国版 ModSDK/资源包
|
|
|
34
35
|
## 🌟 核心特性
|
|
35
36
|
|
|
36
37
|
- 🧩 **模块化开发** - 基于 Addons 维度的依赖管理(基于包管理和依赖的开发与测试流程)
|
|
37
|
-
- 🔄
|
|
38
|
+
- 🔄 **现代语法** - 支持 Python3 现代语法特性,提升开发体验
|
|
38
39
|
- 📦 **生态兼容** - 无缝对接 PyPI 生态,支持标准 `pyproject.toml` 配置
|
|
39
40
|
- 🚀 **智能构建** - 一键打包符合 MCStudio 规范的成品 Addons
|
|
40
41
|
- 🔥 **热重载开发** - 实时监控代码变更,支持 MCStudio 热更新
|
|
@@ -44,7 +45,7 @@ mcpywrap 是基于 Python 生态的《我的世界》中国版 ModSDK/资源包
|
|
|
44
45
|
### 传统开发痛点
|
|
45
46
|
- 📜 **代码复用困难** - 通过 **文件拷贝** 导致版本管理混乱
|
|
46
47
|
- 🚧 **协作效率低下** - 多项目 **重复代码** 维护成本高
|
|
47
|
-
- ⚠️
|
|
48
|
+
- ⚠️ **代码质量** - 缺乏现代开发工具和语法支持
|
|
48
49
|
|
|
49
50
|
### mcpywrap 解决方案
|
|
50
51
|
1. **标准化开发**
|
|
@@ -10,7 +10,7 @@ mcpywrap 是基于 Python 生态的《我的世界》中国版 ModSDK/资源包
|
|
|
10
10
|
## 🌟 核心特性
|
|
11
11
|
|
|
12
12
|
- 🧩 **模块化开发** - 基于 Addons 维度的依赖管理(基于包管理和依赖的开发与测试流程)
|
|
13
|
-
- 🔄
|
|
13
|
+
- 🔄 **现代语法** - 支持 Python3 现代语法特性,提升开发体验
|
|
14
14
|
- 📦 **生态兼容** - 无缝对接 PyPI 生态,支持标准 `pyproject.toml` 配置
|
|
15
15
|
- 🚀 **智能构建** - 一键打包符合 MCStudio 规范的成品 Addons
|
|
16
16
|
- 🔥 **热重载开发** - 实时监控代码变更,支持 MCStudio 热更新
|
|
@@ -20,7 +20,7 @@ mcpywrap 是基于 Python 生态的《我的世界》中国版 ModSDK/资源包
|
|
|
20
20
|
### 传统开发痛点
|
|
21
21
|
- 📜 **代码复用困难** - 通过 **文件拷贝** 导致版本管理混乱
|
|
22
22
|
- 🚧 **协作效率低下** - 多项目 **重复代码** 维护成本高
|
|
23
|
-
- ⚠️
|
|
23
|
+
- ⚠️ **代码质量** - 缺乏现代开发工具和语法支持
|
|
24
24
|
|
|
25
25
|
### mcpywrap 解决方案
|
|
26
26
|
1. **标准化开发**
|
|
@@ -8,11 +8,10 @@ import shutil
|
|
|
8
8
|
import click
|
|
9
9
|
from typing import Dict, List, Tuple, Optional
|
|
10
10
|
|
|
11
|
-
from ..config import read_config, CONFIG_FILE
|
|
11
|
+
from ..config import read_config, CONFIG_FILE
|
|
12
12
|
from .AddonsPack import AddonsPack
|
|
13
13
|
from .MapPack import MapPack
|
|
14
14
|
from .dependency_manager import DependencyManager, DependencyNode
|
|
15
|
-
from ..utils.py3to2_util import py3_to_2
|
|
16
15
|
from ..utils.utils import run_command
|
|
17
16
|
|
|
18
17
|
|
|
@@ -115,12 +114,6 @@ class AddonProjectBuilder:
|
|
|
115
114
|
dep_addon.merge_behavior_into(self.target_addon.behavior_pack_dir)
|
|
116
115
|
dep_addon.merge_resource_into(self.target_addon.resource_pack_dir)
|
|
117
116
|
|
|
118
|
-
# 转换Python文件(如果需要)
|
|
119
|
-
if get_use_3to2():
|
|
120
|
-
click.secho("🔄 将Python 3代码转换为Python 2...", fg="yellow")
|
|
121
|
-
success, output = _convert_project_py3_to_py2(self.target_dir)
|
|
122
|
-
if not success:
|
|
123
|
-
return False, output
|
|
124
117
|
|
|
125
118
|
return True, None
|
|
126
119
|
|
|
@@ -260,15 +253,6 @@ class MapProjectBuilder:
|
|
|
260
253
|
if resource_packs_config:
|
|
261
254
|
click.secho(f"✅ 配置了 {len(resource_packs_config)} 个资源包", fg="green")
|
|
262
255
|
|
|
263
|
-
# 转换Python文件(如果需要)
|
|
264
|
-
if get_use_3to2():
|
|
265
|
-
click.secho("🔄 将Python 3代码转换为Python 2...", fg="yellow")
|
|
266
|
-
# 注意:这里我们需要转换地图中的行为包目录
|
|
267
|
-
behavior_packs_dir = os.path.join(self.target_dir, "behavior_packs")
|
|
268
|
-
if os.path.exists(behavior_packs_dir):
|
|
269
|
-
success, output = _convert_project_py3_to_py2(behavior_packs_dir)
|
|
270
|
-
if not success:
|
|
271
|
-
return False, output
|
|
272
256
|
|
|
273
257
|
return True, None
|
|
274
258
|
|
|
@@ -321,26 +305,3 @@ def _get_ordered_dependencies(root_node: DependencyNode) -> List[List[Dependency
|
|
|
321
305
|
levels.reverse()
|
|
322
306
|
return levels
|
|
323
307
|
|
|
324
|
-
def _convert_project_py3_to_py2(directory):
|
|
325
|
-
"""将整个项目中的Python文件转换为Python 2"""
|
|
326
|
-
try:
|
|
327
|
-
# 首先尝试使用直接的Python API调用
|
|
328
|
-
from lib3to2.main import main
|
|
329
|
-
# main函数接受包名和参数列表
|
|
330
|
-
# 第一个参数是包名 'lib3to2' (这是3to2所有修复器的位置)
|
|
331
|
-
# 第二个参数是命令行参数列表
|
|
332
|
-
exit_code = main('lib3to2.fixes', ['-w', '-n', '-j', '4', '--no-diffs', directory, '--nofix=metaclass'])
|
|
333
|
-
|
|
334
|
-
return exit_code == 0, "转换完成" if exit_code == 0 else f"转换失败,错误代码: {exit_code}"
|
|
335
|
-
except Exception as e:
|
|
336
|
-
# 如果直接调用失败,则尝试命令行方式(作为备选)
|
|
337
|
-
try:
|
|
338
|
-
# 方法1:直接命令行调用
|
|
339
|
-
success, output = run_command(["3to2", "-w", "-n", directory])
|
|
340
|
-
if not success:
|
|
341
|
-
# 方法2:使用shell=True参数
|
|
342
|
-
success, output = run_command(["3to2", "-w", "-n", directory], shell=True)
|
|
343
|
-
|
|
344
|
-
return success, output
|
|
345
|
-
except Exception as cmd_e:
|
|
346
|
-
return False, f"Python API调用失败: {str(e)}\n命令行调用也失败: {str(cmd_e)}"
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
安装依赖命令模块
|
|
5
|
+
"""
|
|
6
|
+
import click
|
|
7
|
+
import subprocess
|
|
8
|
+
import sys
|
|
9
|
+
from ..config import config_exists, add_dependency, get_project_dependencies
|
|
10
|
+
from ..utils.pip_error_parser import display_pip_error, suggest_common_fixes
|
|
11
|
+
|
|
12
|
+
@click.command()
|
|
13
|
+
@click.argument('package', required=True)
|
|
14
|
+
def add_cmd(package):
|
|
15
|
+
"""安装依赖并添加到项目配置中"""
|
|
16
|
+
# 检查项目是否已初始化
|
|
17
|
+
if not config_exists():
|
|
18
|
+
click.echo(click.style('❌ 项目尚未初始化,请先运行 mcpy init', fg='red', bold=True))
|
|
19
|
+
return
|
|
20
|
+
|
|
21
|
+
# 检查依赖是否已存在
|
|
22
|
+
dependencies = get_project_dependencies()
|
|
23
|
+
|
|
24
|
+
if package in dependencies:
|
|
25
|
+
click.echo(click.style(f'ℹ️ 依赖 {package} 已存在于项目配置中', fg='blue'))
|
|
26
|
+
else:
|
|
27
|
+
# 添加依赖到配置
|
|
28
|
+
if add_dependency(package):
|
|
29
|
+
click.echo(click.style(f'✅ 依赖 {package} 已添加到项目配置', fg='green'))
|
|
30
|
+
else:
|
|
31
|
+
click.echo(click.style(f'❌ 添加依赖 {package} 失败', fg='red'))
|
|
32
|
+
|
|
33
|
+
# 实际安装依赖
|
|
34
|
+
click.echo(click.style(f'📦 正在安装 {package}...', fg='cyan'))
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
# 捕获pip输出以便进行错误分析
|
|
38
|
+
result = subprocess.run(
|
|
39
|
+
[sys.executable, '-m', 'pip', 'install', package],
|
|
40
|
+
capture_output=True,
|
|
41
|
+
text=True,
|
|
42
|
+
encoding='utf-8',
|
|
43
|
+
check=True
|
|
44
|
+
)
|
|
45
|
+
click.echo(click.style(f'✅ {package} 安装成功!', fg='green', bold=True))
|
|
46
|
+
except subprocess.CalledProcessError as e:
|
|
47
|
+
click.echo(click.style(f'❌ 依赖包 {package} 安装失败', fg='red', bold=True))
|
|
48
|
+
|
|
49
|
+
# 显示友好的错误信息
|
|
50
|
+
error_output = e.stderr if e.stderr else e.stdout
|
|
51
|
+
display_pip_error(error_output, show_raw_output=False)
|
|
52
|
+
|
|
53
|
+
# 询问是否显示详细错误信息
|
|
54
|
+
if click.confirm(click.style("❓ 是否查看详细错误信息以便调试?", fg="magenta"), default=False):
|
|
55
|
+
click.echo()
|
|
56
|
+
click.echo(click.style("📋 完整错误输出:", fg='cyan', bold=True))
|
|
57
|
+
click.echo(click.style("-" * 40, fg='cyan'))
|
|
58
|
+
if e.stderr:
|
|
59
|
+
click.echo("STDERR:")
|
|
60
|
+
click.echo(e.stderr)
|
|
61
|
+
if e.stdout:
|
|
62
|
+
click.echo("STDOUT:")
|
|
63
|
+
click.echo(e.stdout)
|
|
64
|
+
click.echo(click.style("-" * 40, fg='cyan'))
|
|
65
|
+
|
|
66
|
+
# 显示通用解决建议
|
|
67
|
+
suggest_common_fixes()
|
|
68
|
+
|
|
69
|
+
click.echo(click.style(f'💡 您可以尝试手动运行: pip install {package}', fg='yellow'))
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"""
|
|
5
5
|
import os
|
|
6
6
|
import click
|
|
7
|
-
from ..config import config_exists, get_mcpywrap_config, get_project_type
|
|
7
|
+
from ..config import config_exists, get_mcpywrap_config, get_project_type, ensure_map_setuptools_sync
|
|
8
8
|
from ..builders.project_builder import AddonProjectBuilder, MapProjectBuilder
|
|
9
9
|
|
|
10
10
|
|
|
@@ -18,6 +18,9 @@ def build_cmd(merge):
|
|
|
18
18
|
click.secho('❌ 错误: 未找到配置文件。请先运行 `mcpywrap init` 初始化项目。', fg="red")
|
|
19
19
|
return False
|
|
20
20
|
|
|
21
|
+
# 确保 map 项目的 setuptools 配置同步
|
|
22
|
+
ensure_map_setuptools_sync(interactive=True)
|
|
23
|
+
|
|
21
24
|
# 获取mcpywrap特定配置
|
|
22
25
|
mcpywrap_config = get_mcpywrap_config()
|
|
23
26
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import click
|
|
4
4
|
import os
|
|
5
|
-
from ..config import update_config, config_exists, read_config, get_project_type
|
|
5
|
+
from ..config import update_config, config_exists, read_config, get_project_type, ensure_map_setuptools_sync
|
|
6
6
|
from .init_cmd import init as init_project
|
|
7
7
|
from ..minecraft.netease_modsdk import check_installed_modsdk, get_available_versions, download_and_install_package
|
|
8
8
|
from ..utils.project_setup import find_and_configure_behavior_pack, install_project_dev_mode
|
|
@@ -26,6 +26,9 @@ def default_cmd():
|
|
|
26
26
|
else:
|
|
27
27
|
click.echo(click.style('🔄 正在刷新项目...', fg='blue'))
|
|
28
28
|
|
|
29
|
+
# 确保 map 项目的 setuptools 配置同步
|
|
30
|
+
ensure_map_setuptools_sync(interactive=True)
|
|
31
|
+
|
|
29
32
|
# 加载现有配置
|
|
30
33
|
config = read_config()
|
|
31
34
|
project_type = get_project_type()
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import os
|
|
7
7
|
import time
|
|
8
8
|
import click
|
|
9
|
-
from ..config import get_mcpywrap_config, config_exists, read_config, get_project_type, CONFIG_FILE
|
|
9
|
+
from ..config import get_mcpywrap_config, config_exists, read_config, get_project_type, CONFIG_FILE, ensure_map_setuptools_sync
|
|
10
10
|
from ..builders.watcher import ProjectWatcher
|
|
11
11
|
from .build_cmd import build
|
|
12
12
|
|
|
@@ -31,6 +31,9 @@ def dev_cmd():
|
|
|
31
31
|
click.secho('❌ 错误: 未找到配置文件。请先运行 `mcpywrap init` 初始化项目。', fg="red")
|
|
32
32
|
return False
|
|
33
33
|
|
|
34
|
+
# 确保 map 项目的 setuptools 配置同步
|
|
35
|
+
ensure_map_setuptools_sync(interactive=True)
|
|
36
|
+
|
|
34
37
|
# 获取mcpywrap特定配置
|
|
35
38
|
mcpywrap_config = get_mcpywrap_config()
|
|
36
39
|
|
|
@@ -28,6 +28,7 @@ from ..utils.project_setup import (
|
|
|
28
28
|
get_default_author, get_default_email, get_default_project_name, find_behavior_pack_dir,
|
|
29
29
|
update_behavior_pack_config, install_project_dev_mode
|
|
30
30
|
)
|
|
31
|
+
from ..config import update_map_setuptools_config
|
|
31
32
|
from ..minecraft.template.mod_template import open_ui_crate_mod
|
|
32
33
|
|
|
33
34
|
# 创建控制台对象
|
|
@@ -228,20 +229,7 @@ def init():
|
|
|
228
229
|
else:
|
|
229
230
|
console.print("[dim]未添加任何依赖项[/]")
|
|
230
231
|
|
|
231
|
-
# 询问是否使用3to2转换
|
|
232
|
-
use_3to2 = Confirm.ask(
|
|
233
|
-
"[magenta]❓ 是否使用3to2自动将Python 3代码转换为Python 2?[/]",
|
|
234
|
-
default=False,
|
|
235
|
-
console=console
|
|
236
|
-
)
|
|
237
|
-
|
|
238
|
-
if use_3to2:
|
|
239
|
-
console.print("[green]✅ 已启用3to2转换[/]")
|
|
240
|
-
else:
|
|
241
|
-
console.print("[yellow]ℹ️ 已禁用3to2转换[/]")
|
|
242
|
-
|
|
243
232
|
project_info['dependencies'] = dependencies
|
|
244
|
-
project_info['use_3to2'] = use_3to2
|
|
245
233
|
|
|
246
234
|
# 第4阶段:项目类型检测
|
|
247
235
|
current_stage += 1
|
|
@@ -450,16 +438,14 @@ def init():
|
|
|
450
438
|
'readme': "README.md",
|
|
451
439
|
'requires-python': python_requires,
|
|
452
440
|
'dependencies': dependencies,
|
|
453
|
-
'license':
|
|
441
|
+
'license': license_name,
|
|
454
442
|
'classifiers': [
|
|
455
|
-
f"License :: OSI Approved :: {license_name} License",
|
|
456
443
|
"Programming Language :: Python",
|
|
457
444
|
"Programming Language :: Python :: 3",
|
|
458
445
|
]
|
|
459
446
|
},
|
|
460
447
|
'tool': {
|
|
461
448
|
'mcpywrap': {
|
|
462
|
-
'use_3to2': use_3to2,
|
|
463
449
|
'project_type': project_type
|
|
464
450
|
}
|
|
465
451
|
}
|
|
@@ -476,10 +462,19 @@ def init():
|
|
|
476
462
|
if project_url:
|
|
477
463
|
config['project']['urls'] = {'Homepage': project_url}
|
|
478
464
|
|
|
479
|
-
#
|
|
465
|
+
# 根据项目类型配置 setuptools
|
|
480
466
|
if project_type == "addon" and behavior_pack_dir:
|
|
481
467
|
rel_path = update_behavior_pack_config(config, base_dir, behavior_pack_dir, target_dir)
|
|
482
468
|
console.print(f"[green]📦 已配置自动包发现于: [bold white]{rel_path}[/][/]")
|
|
469
|
+
elif project_type == "map":
|
|
470
|
+
# 为 map 项目添加基本的 setuptools 配置,排除地图目录
|
|
471
|
+
config.setdefault('tool', {})['setuptools'] = {
|
|
472
|
+
'packages': {
|
|
473
|
+
'find': {
|
|
474
|
+
'exclude': ["behavior_packs*", "resource_packs*", "db*"]
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
483
478
|
|
|
484
479
|
# 创建.gitignore文件
|
|
485
480
|
if Confirm.ask(
|
|
@@ -566,6 +561,11 @@ work.mcscfg
|
|
|
566
561
|
install_project_dev_mode()
|
|
567
562
|
install_progress.update(install_task, completed=1)
|
|
568
563
|
|
|
564
|
+
# 为 map 项目自动扫描和配置 behavior_packs
|
|
565
|
+
if project_type == "map":
|
|
566
|
+
console.print("\n[cyan]🔍 扫描 behavior_packs 目录...[/]")
|
|
567
|
+
update_map_setuptools_config(interactive=False)
|
|
568
|
+
|
|
569
569
|
# 总结
|
|
570
570
|
console.print(Panel.fit(
|
|
571
571
|
f"[bold green]✅ 初始化完成![/]\n\n"
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
删除依赖命令模块
|
|
5
|
+
"""
|
|
6
|
+
import click
|
|
7
|
+
import subprocess
|
|
8
|
+
import sys
|
|
9
|
+
from ..config import config_exists, remove_dependency, get_project_dependencies
|
|
10
|
+
from ..utils.pip_error_parser import display_pip_error, suggest_common_fixes
|
|
11
|
+
|
|
12
|
+
@click.command()
|
|
13
|
+
@click.argument('package', required=True)
|
|
14
|
+
@click.option('--uninstall', '-u', is_flag=True, help='同时卸载依赖包')
|
|
15
|
+
def remove_cmd(package, uninstall):
|
|
16
|
+
"""从项目配置中删除依赖并可选择卸载"""
|
|
17
|
+
# 检查项目是否已初始化
|
|
18
|
+
if not config_exists():
|
|
19
|
+
click.echo(click.style('❌ 项目尚未初始化,请先运行 mcpy init', fg='red', bold=True))
|
|
20
|
+
return
|
|
21
|
+
|
|
22
|
+
# 检查依赖是否存在
|
|
23
|
+
dependencies = get_project_dependencies()
|
|
24
|
+
|
|
25
|
+
if package not in dependencies:
|
|
26
|
+
click.echo(click.style(f'❌ 依赖 {package} 不存在于项目配置中', fg='red'))
|
|
27
|
+
return
|
|
28
|
+
|
|
29
|
+
# 从配置中删除依赖
|
|
30
|
+
if remove_dependency(package):
|
|
31
|
+
click.echo(click.style(f'✅ 依赖 {package} 已从项目配置中移除', fg='green'))
|
|
32
|
+
else:
|
|
33
|
+
click.echo(click.style(f'❌ 移除依赖 {package} 失败', fg='red'))
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
# 如果指定了卸载选项,则卸载包
|
|
37
|
+
if uninstall:
|
|
38
|
+
click.echo(click.style(f'🗑️ 正在卸载 {package}...', fg='cyan'))
|
|
39
|
+
try:
|
|
40
|
+
# 捕获pip输出以便进行错误分析
|
|
41
|
+
result = subprocess.run(
|
|
42
|
+
[sys.executable, '-m', 'pip', 'uninstall', '-y', package],
|
|
43
|
+
capture_output=True,
|
|
44
|
+
text=True,
|
|
45
|
+
encoding='utf-8',
|
|
46
|
+
check=True
|
|
47
|
+
)
|
|
48
|
+
click.echo(click.style(f'✅ {package} 卸载成功!', fg='green', bold=True))
|
|
49
|
+
except subprocess.CalledProcessError as e:
|
|
50
|
+
click.echo(click.style(f'❌ 依赖包 {package} 卸载失败', fg='red', bold=True))
|
|
51
|
+
|
|
52
|
+
# 显示友好的错误信息
|
|
53
|
+
error_output = e.stderr if e.stderr else e.stdout
|
|
54
|
+
display_pip_error(error_output, show_raw_output=False)
|
|
55
|
+
|
|
56
|
+
# 询问是否显示详细错误信息
|
|
57
|
+
if click.confirm(click.style("❓ 是否查看详细错误信息以便调试?", fg="magenta"), default=False):
|
|
58
|
+
click.echo()
|
|
59
|
+
click.echo(click.style("📋 完整错误输出:", fg='cyan', bold=True))
|
|
60
|
+
click.echo(click.style("-" * 40, fg='cyan'))
|
|
61
|
+
if e.stderr:
|
|
62
|
+
click.echo("STDERR:")
|
|
63
|
+
click.echo(e.stderr)
|
|
64
|
+
if e.stdout:
|
|
65
|
+
click.echo("STDOUT:")
|
|
66
|
+
click.echo(e.stdout)
|
|
67
|
+
click.echo(click.style("-" * 40, fg='cyan'))
|
|
68
|
+
|
|
69
|
+
click.echo(click.style(f'💡 您可以尝试手动运行: pip uninstall {package}', fg='yellow'))
|
|
@@ -13,7 +13,7 @@ from datetime import datetime
|
|
|
13
13
|
|
|
14
14
|
from ..builders import DependencyManager
|
|
15
15
|
from ..builders.MapPack import MapPack
|
|
16
|
-
from ..config import config_exists, read_config, get_project_dependencies, get_project_type, get_project_name
|
|
16
|
+
from ..config import config_exists, read_config, get_project_dependencies, get_project_type, get_project_name, ensure_map_setuptools_sync
|
|
17
17
|
from ..builders.AddonsPack import AddonsPack
|
|
18
18
|
from ..mcstudio.game import open_game, open_safaia
|
|
19
19
|
from ..mcstudio.mcs import get_mcs_download_path, get_mcs_game_engine_dirs, get_mcs_game_engine_data_path, is_windows
|
|
@@ -369,6 +369,9 @@ def run_cmd(new, list, delete, force, clean_all, instance_prefix):
|
|
|
369
369
|
console.print("❌ 项目尚未初始化,请先运行 mcpy init", style="red bold")
|
|
370
370
|
return
|
|
371
371
|
|
|
372
|
+
# 确保 map 项目的 setuptools 配置同步
|
|
373
|
+
ensure_map_setuptools_sync(interactive=True)
|
|
374
|
+
|
|
372
375
|
project_name = get_project_name()
|
|
373
376
|
|
|
374
377
|
# 创建运行时配置目录
|