众所周知,VS的工程目录十分复杂,一堆ncb,project,filter,user等等乱七八糟的文件,与源码cpp/h等放在一起十分的恶心。
而且debug/release目录里又有十分多的obj,sbr,bsr等文件。
这里介绍个手工修改工程模版的方法,实现每次新建工程时,自动生成的目录结构十分的清晰
效果结构:
/解决方案名/工程名称/src/* // 只有cpp/c/h/hpp文件,很清晰
/解决方案名/工程名称/res/* // 什么ico,bmp,mainfest啊,都在这里
/解决方案名/工程名称/* // 工程配置文件,以及def/rc两个文件
/解决方案名/obj/工程名称/debug/* // 一些不需要关心的临时文件
/解决方案名/obj/工程名称/release/* // 一些不需要关心的临时文件
/解决方案名/out/ // 编译出来的exe,dll等,放一个目录里,包括同一个解决方案下的其他工程模块
===================
D:\dev\vs2003\Vc7\VCWizards\2052\common.js第一处修改地方
查找GetTargetName (......)
在这行后面添加上
var extName = strTarget.substring(strTarget.lastIndexOf('.')+1, strTarget.length).toLowerCase();
if(strTarget.lastIndexOf('/') == -1 && strTarget.lastIndexOf('\\') == -1)
{
var filename = strTarget.toLowerCase();
if( filename == "readme.txt" ) {
continue;
} else if( filename == "resource.h" ) {
// 必须与rc放同目录
}
else if(extName == "cpp" || extName == "c" || extName=="h" || extName == "hpp" || extName=="inl" || extName == "inc" )
{
strTarget = "src/" + strTarget;
}
else if(extName == "def" || extName == "rc" ) {
//rc文件必须得放目录下,因为一些模板文件指定了绝对路径,很蛋疼
}
else{
strTarget = "res/" + strTarget;
}
}
这样就实现了创建工程时目录自动分类了,不过在工程里添加新代码文件时还不是自动归类, 这方面暂时未解决,若哪天解决了我再编辑写这文章,现在只能在添加的时候,手工加入src/路径。
若对于头文件想自动归类到inc目录的话,请自行修改。
--
第二处修改地方
查找AddCommonConfig
在函数前面加一句
g_macroName_Configuration = null;
然后在var config = oProj.Object.Configurations("Debug"); 和 config = oProj.Object.Configurations("Release"); 后面分别加上以下内容
if(g_macroName_Configuration == null){
g_macroName_Configuration = config.IntermediateDirectory; // 只取一次初始配置,防止在方案下第二个工程使用了第一个工程的配置
}
var macroName_Configuration = g_macroName_Configuration;
// VER <= VS2008 IS "$(ConfigurationName)\";
// VER >= VS2010 IS "$(Configuration)\"
// 识别debug/release所用的宏名称,这里直接使用原先的内容,动态识别.
//config.IntermediateDirectory = "$(SolutionDir)obj/$(ProjectName)/"+macroName_Configuration;
// 存放obj到解决方案下
config.IntermediateDirectory = "e:/tmp-dev/$(SolutionName)/$(ProjectName)/"+macroName_Configuration;
// 也可以放在固定位置,这样工程目录就又更清晰了
config.OutputDirectory = "$(SolutionDir)out\\";
// 将exe,dll,pdb放在out目录。
这个有两处,一个debug,一个release,分别修改下。
另外,由于我们debug/release都是放out目录里,所以需要设置成两个不同的最终exe名称。这里是增加个D表示是debug版本.
搜索 AddFilesToProject( ,在其try的第一行加入以下指令(其实这个就在刚才修改文件归类的前面就是了)
function vs_add_debug_name() {
var dbg_config = oProj.Object.Configurations("Debug");
var rules = dbg_config.Rules;
if(rules != null) {
var ob = rules.Item("ConfigurationGeneral");
ob.SetPropertyValue( "TargetName", ob.GetUnevaluatedPropertyValue("TargetName") + "D" );
}
else {
function InsertDebugFileName(filepath) {
var dotpos = filepath.lastIndexOf('.');
if(dotpos > 0 ) {
filepath = filepath.substr(0, dotpos) + "D" + filepath.substr(dotpos);
}
return filepath;
};
var dbg_link = dbg_config.Tools("VCLinkerTool");
if(dbg_link){
dbg_link.OutputFile = InsertDebugFileName(dbg_link.OutputFile);
dbg_link.ProgramDatabaseFile = InsertDebugFileName(dbg_link.ProgramDatabaseFile);
}
var dbg_lib = dbg_config.Tools("VCLibrarianTool");
if(dbg_lib){
dbg_lib.OutputFile = InsertDebugFileName(dbg_lib.OutputFile);
}
}
};
vs_add_debug_name();
function insert_includes(dir){
function insert_config_include(name, dir) {
var config = oProj.Object.Configurations(name);
var cl_tools = config.Tools("VCCLCompilerTool");
if(cl_tools){
cl_tools.AdditionalIncludeDirectories = dir + ";" + cl_tools.AdditionalIncludeDirectories;
}
var res_tools = config.Tools("VCResourceCompilerTool");
if(res_tools){
res_tools.AdditionalIncludeDirectories = dir + ";" + res_tools.AdditionalIncludeDirectories;
}
};
insert_config_include("Debug", dir);
insert_config_include("Release", dir);
}
insert_includes("res");
insert_includes("src");
insert_includes(".");
后面的insert_includes是解决rc路径的头文件问题。以及其他放在工程目录下的cpp/h对src的引用路径问题
over
本方法已经在vs2003/2008/2010中试验通过,但有部分向导创建的文件还是有部分遗留文件问题,但基本不多,可以自己手工移动下