修改cocos2d-x项目创建器,支持自定义项目路径

问题

cocos2d-x目前的项目生成使用的是tools/project-creator/create_project.py 命令。这个命令生成的项目,默认处于cocos2d-x的projects文件夹中。

我当然不希望自己的项目处于 cocos2d-x的目录结构中文件夹中,这样不方便管理。

尝试解决

我首先想到的是使用 mklink 来解决,让 projects中的项目文件夹是我自己的项目文件夹的一个 symbol link。 mklink 是 WIN7自带的一个命令,必须在管理员模式下运行。

但这个方法有个问题,让我们来看看模版文件:[cocos2d-x]\template\multi-platform-cpp\proj.win32\HelloCpp.sln

......
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcocos2d", "..\..\..\cocos2dx\proj.win32\cocos2d.vcxproj", "{98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}"
......
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libCocosDenshion", "..\..\..\CocosDenshion\proj.win32\CocosDenshion.vcxproj", "{F8EDD7FA-9A51-4E80-BAEB-860825D2EAC6}"
......

Virtual Studio项目解决方案中对于其他项目的引用,采用的是相对路径,如果我在symbol link 的文件夹中打开这个项目,当然没有问题。但是如果我在自己的项目文件夹中打开这个项目,这个相对路径引用就会出错。

我想到的另一个解决方案就是使用环境变量。

我定义了一个 COCOS2DX_HOME 环境变量,指向我本机的cocos2d-x的安装目录:d:\cocos2dx\2.1.4 ,然后在解决方案(.sln)文件中将相对路径修改成这样:

......
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcocos2d", "$(COCOS2DX_HOME)\cocos2dx\proj.win32\cocos2d.vcxproj", "{98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}"
......
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libCocosDenshion", "$(COCOS2DX_HOME)\CocosDenshion\proj.win32\CocosDenshion.vcxproj", "{F8EDD7FA-9A51-4E80-BAEB-860825D2EAC6}"
......

但在打开这个解决方案的时候,Virtual Studio报错如下:

项目文件 "d:\works\projects\test\proj.win32\$(COCOS2DX_HOME)\CocosDenshion\proj.win32\CocosDenshion.vcxproj" 已被移动、重命名或不在您的计算机上

这说明解决方案并不支持环境变量。

根据dualface的留言,原来解决方案是支持环境变量的,使用 %COCOS2DX_HOME%这种语法即可。

最终解决

目前的解决方案,就是修改创建项目脚本,使其支持自定义项目文件夹,并在生成的时候自动替换解决方案(*.sln)中引用目录为绝对路径。当然,也可以替换成环境变量。

当然,还有项目文件(*.vcxproj)中的一部分引用,这个引用是支持环境变量的。

这就需要修改 [cocos2dx]\tools\project-creator\create_project.py[cocos2dx]\template\multi-platform-cpp\

我将它们按照原来的目录结构进行了整理,使其仅包含这两个修改过的文件夹。由于内容可能会经常修改,我在github 上建立了一个项目。

此项目基于 cocos2d-x 2.1.4。

cocos2d-x-project-creator

使用方法

  1. 定义一个环境变量 COCOS2DX_HOME,指向 cocos2d-x 安装目录。

  2. 使用github项目中的文件夹覆盖自己的cocos2d-x文件夹中的同名目录。用 OS X 的同学要小心点。

  3. 后面就看 Usage 吧:

    Usage: create_project.py -project PROJECT_NAME -package PACKAGE_NAME -language PROGRAMING_LANGUAGE -path d:/works/projects/ Options: -project PROJECT_NAME Project name, for example: MyGame -package PACKAGE_NAME Package name, for example: com.MyCompany.MyAwesomeGame -language PROGRAMING_LANGUAGE Major programing lanauge you want to used, should be [cpp | lua | javascript] -path PROJECT_PATH The directory that project will create in, should be [ d:/works/projects/ | /home/zrong/projects/ ]

    Sample 1: ./create_project.py -project MyGame -package com.MyCompany.AwesomeGame Sample 2: ./create_project.py -project MyGame -package com.MyCompany.AwesomeGame -language cpp -path d:/works/projects/