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.
Files changed (65) hide show
  1. mcpywrap-0.2.3/LICENSE +21 -0
  2. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/PKG-INFO +5 -4
  3. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/README.md +2 -2
  4. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/project_builder.py +1 -40
  5. mcpywrap-0.2.3/mcpywrap/commands/add_cmd.py +69 -0
  6. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/build_cmd.py +4 -1
  7. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/default_cmd.py +4 -1
  8. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/dev_cmd.py +4 -1
  9. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/init_cmd.py +17 -17
  10. mcpywrap-0.2.3/mcpywrap/commands/remove_cmd.py +69 -0
  11. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/run_cmd.py +4 -1
  12. mcpywrap-0.2.3/mcpywrap/config.py +281 -0
  13. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/symlinks.py +17 -9
  14. mcpywrap-0.2.3/mcpywrap/utils/pip_error_parser.py +184 -0
  15. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/utils/project_setup.py +36 -4
  16. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/PKG-INFO +5 -4
  17. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/SOURCES.txt +2 -1
  18. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/requires.txt +0 -1
  19. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/pyproject.toml +1 -2
  20. mcpywrap-0.2.2/mcpywrap/commands/add_cmd.py +0 -39
  21. mcpywrap-0.2.2/mcpywrap/commands/remove_cmd.py +0 -42
  22. mcpywrap-0.2.2/mcpywrap/config.py +0 -143
  23. mcpywrap-0.2.2/mcpywrap/utils/py3to2_util.py +0 -53
  24. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/__init__.py +0 -0
  25. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/__main__.py +0 -0
  26. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/AddonsPack.py +0 -0
  27. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/MapPack.py +0 -0
  28. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/__init__.py +0 -0
  29. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/dependency_manager.py +0 -0
  30. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/file_merge.py +0 -0
  31. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/builders/watcher.py +0 -0
  32. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/cli.py +0 -0
  33. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/__init__.py +0 -0
  34. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/edit_cmd.py +0 -0
  35. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/mod_cmd.py +0 -0
  36. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/modsdk_cmd.py +0 -0
  37. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/publish_cmd.py +0 -0
  38. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/commands/ui_cmd.py +0 -0
  39. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/custom_packaging.py +0 -0
  40. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/SimpleMonitor.py +0 -0
  41. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/__init__.py +0 -0
  42. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/editor.py +0 -0
  43. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/game.py +0 -0
  44. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/mcs.py +0 -0
  45. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/runtime_cppconfig.py +0 -0
  46. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/studio_server.py +0 -0
  47. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/studio_server_ui.py +0 -0
  48. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/symlink_helper_global.py +0 -0
  49. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/mcstudio/symlink_helper_map.py +0 -0
  50. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/__init__.py +0 -0
  51. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/addons.py +0 -0
  52. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/level_dat.py +0 -0
  53. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/map.py +0 -0
  54. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/netease_modsdk.py +0 -0
  55. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/template/generate_mod_files.py +0 -0
  56. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/minecraft/template/mod_template.py +0 -0
  57. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/ui/__init__.py +0 -0
  58. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/ui/project_ui.py +0 -0
  59. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/utils/__init__.py +0 -0
  60. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/utils/print_guide.py +0 -0
  61. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap/utils/utils.py +0 -0
  62. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/dependency_links.txt +0 -0
  63. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/entry_points.txt +0 -0
  64. {mcpywrap-0.2.2 → mcpywrap-0.2.3}/mcpywrap.egg-info/top_level.txt +0 -0
  65. {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.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
- - 🔄 **语法无忧** - 开发阶段支持 Python3 语法,构建时自动转换为 Python2
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
- - ⚠️ **语法限制** - 中国版仅支持 Python2,缺乏现代语法支持
48
+ - ⚠️ **代码质量** - 缺乏现代开发工具和语法支持
48
49
 
49
50
  ### mcpywrap 解决方案
50
51
  1. **标准化开发**
@@ -10,7 +10,7 @@ mcpywrap 是基于 Python 生态的《我的世界》中国版 ModSDK/资源包
10
10
  ## 🌟 核心特性
11
11
 
12
12
  - 🧩 **模块化开发** - 基于 Addons 维度的依赖管理(基于包管理和依赖的开发与测试流程)
13
- - 🔄 **语法无忧** - 开发阶段支持 Python3 语法,构建时自动转换为 Python2
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
- - ⚠️ **语法限制** - 中国版仅支持 Python2,缺乏现代语法支持
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, get_use_3to2
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': {'text': license_name},
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
- # 如果是addon类型,更新行为包配置
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
  # 创建运行时配置目录