一半君的总结纸

听话只听一半君

#119 如何快速搜索项目代码?

虽然whatIs所有人都知道,但是当

  • 你想搜的mel一开始并不在maya的maya_script_path里的时候
  • 公司的代码散布在多个不同的文件夹下的时候(没有一个公共的总文件夹,或者总文件夹过大的时候,通常是后者)
  • 当代码是其他语言如python的时候
  • 当代码不是在maya里执行的时候
  • 当你只能猜到代码里某个字符串的时候

如果是mel,大部分global proc 都可以用whatIs来找到,但是这样是找不到global proc名字和文件名不同的proc的,比如,假设你有这么一个.mel文件

global proc a(){

    print "yeah in proc a\n";
}

global proc b(){

    print "yeah in proc b\n";
}

此时你在maya里用whatIs是找不到b的

whatIs a;
// Result: Script found in: /home/oglop/maya/scripts/a.mel // 
whatIs b;
// Result: Unknown // 

# 除非你把a.mel source一下
source a.mel;
whatIs b;
// Result: Mel procedure found in: /home/oglop/maya/scripts/a.mel // 

况且有很多.mel文件里的proc还不是global proc, 用whatIs 就更找不着了,除非你去被调用的global proc文件里,肉眼找

此外多个项目同时进行的时候,大多数公司都采取了动态的添加path的方法,而不是一次把所有的path都加进去(没有必要而且增加debug难度),大部分公司也会把项目的path放在全公司通用的代码的path前面(可能不止一个,比如各个组 anim / fx / creatureFx 都有自己部门的工具,很可能这些工具都不是dev组维护的,大部分公司frontend pipeline组也有自己的工具)这样各种路径都要根据具体是哪个项目而动态的加到maya_script_path里(当然还有sys.path),而且大部分公司pipeline组写代码的时候一般都是在sandbox path里写的,为了方便测试起见(当然这是因为其他更重要的原因,要根据项目开不同配置的maya),一般都会让maya wrapper script 有 -dev 或者 -devuser这样的参数,这样启动以后你的sandbox的路径被加到最前面,以保证你测试自己写的代码的时候不会影响到别人(同时测试的时候用的是你写的或者修改的代码,废话)

总之就是不用点别的工具,搜代码不是那么容易搜的,特别是在公司里,大部分上了规模的公司都是linux,下面以CentOS 7为例(windows下一样有办法能用这些工具),举的例子都假设我想搜Hypershade菜单里的 Edit -> Delete Duplicate Shading Networks在哪里,这可能不是个好例子(因为你去script editor里看也行,如果找不到,你可以猜这段代码里也许有 “deleteDuplicate”)

一些小工具
  • 最常见的当然是grep,这是个人都知道,但是他是最“弱“的
    # 当然普通这样就可以了
    # -i 忽略大小写
    # -R 搜索子文件夹
    grep -iR deleteDuplicate /usr/autodesk/maya2015-x64/scripts/ 
    
    # 我加sed是为了文件名后面的:换成空格
    # -n 显示行号
    # --color=always 保持颜色,不然sed过后就没颜色了
    grep -inR --color=always deleteDuplicate /usr/autodesk/maya2015-x64/scripts/ |  sed 's/:/ /'
    
    # 当然正常人敲这么长很麻烦,linux是有alias的嘛
    # cshell举例,大部分国外大公司还是cshell,因为发展太早,大堆脚本不想重写,就没换了,放在~/.cshrc里
    alias grepc="grep -inR \\!* |  sed 's/:/ /'"
    
    # 所以你用的时候就这样就行了,当然如果你每次就只搜这个目录,把他放到alias里面去也行
    grepc deleteDuplicate /usr/autodesk/maya2015-x64/scripts/
    
    #bash举例,放到~/.bashrc里
    mygrep() {
        grep -inR --color=always $1 $2 |  sed 's/:/ /'
    }
    alias grepc=mygrep
    
    # 用的时候也是和上面一样
    
    

    grep

  • 高级一点的ack
    ack -i deleteDuplicate /usr/autodesk/maya2015-x64/scripts/
    

    ack

    在vim里通过ack.vim插件来使用ack
    ack.vim

  • ag – The silver searcher
    yum install the_silver_searcher
    
    # 搜
    ag -i deleteDuplicate /usr/autodesk/maya2015-x64/scripts/
    

    the_silver_searcher

    当然,对应的vim插件也是有的 ag.vim

  • The platinum searcher

    当然他也有对应的vim插件 Unite.vim.

  • sift

另一类方案

如果代码多,每次现搜还是花时间的,如果想“瞬间”得到结果,那大概就需要这种东西了(适合在公司里多人使用)

{OpenGrok

下面lz来装一个试试,虽说只用这个来搜maya自带script是杀鸡用牛刀,为了简单演示起见,下面用了现成的docker iamge achanda/docker-opengrok

sudo docker run -d -v /usr/autodesk/maya2015-x64/scripts:/src -p 80:8080 itszero/opengrok

之后你就可以 在 http://localhost/source/ 搜了, 当然真实世界中,右边的”project”应该是各个组的代码存放文件夹之类的
opengrok

一般公司都会用svn或者perforce,当然opengrok也可以直接连到他们上

参考:
#01 怎样找到Script Editor里出来的那些命令? 为什么有些命令在帮助里找不到!
好用的Vim插件
Docker run 命令的使用方法
Docker简单使用
Docker security
如何进入正在执行的 docker container

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: