WP-Douban-Post发布后记
距离WP-Douban-Post发布已经有差不多两个月了。总想写点什么总结一下。
缘由
说起来初衷很简单。我的博客可以同步到twitter,新浪,就差同步到豆瓣上了。受不了每次人肉同步的繁琐,又没找到合适的现成wordpress插件,又打算学习一下Oauth+Douban API + WordPress Plugin的各种技术,袖子管一卷咱就干了起来。
过程
前后大概花了一周的业余时间,大概按照如下的步骤走了一遍,总算是客服了重重难关,完成了这个插件。
1)Wordpress Hello World Plugin (了解Wordpress插件结构)
2)Wordpress Option Page(了解添加配置选项,存取数据库,添加事件响应)
3)Douban Oauth (Douban Zend Client太复杂,只好自己用php oauth library。自己拼接header,测试MD5验证,多谢Douban API支持,这部分是最艰辛的)
4)Douban API 调用(真正开始调用API,发送自己的记录到我说)
5)WP-Douban-Post (拼装完成,达达达搭)
推广
说是推广其实是抬举了自己。自己作了好用当然是想广而告之显摆一下。第一个想到的自然就是wordpress.org插件库。如果可以在Plugins里面搜索到自己的名字,想想就威风。
提交开发者申请,编写README,提交代码。所有的步骤都有清楚的指南。Wordpress.org基于SVN的发布系统让我大开眼界,收益非浅。
1)通过README提取插件信息,例如作者信息,安装指南,Q&A,对开发人员和wordpress.org都是方便清楚。
2)建议开发者拉branch进行发布,通过README元信息指定发布的具体branch.通过这样的最佳实践直接帮助开发者分清了发布和开发的代码。清晰明了。
然后就是更新豆瓣应用信息,在豆瓣API小组发贴庆祝。然后就是每天刷屏期待了。。。这就是我做的推广-,-。大概的情形趋势图上都清清楚楚。
1)2011-01-19,推荐给了几个用豆瓣也用Wordpress的朋友,小推销了一把,迎来了下载高峰。
2)2011-01-21 to 2011-02-12,春节期间,下载量逐渐走低。。。。
3)2011-02-13 to 2011-02-20,春节结束,赢了小小的反弹。。。。
4)2011-02-21 to 2011-03-20, 大概可以看出周末基本没有下载,工作日偶尔有人。。
5)2011-03-25, 豆瓣有了应用小站,很荣幸被发布了出来,还被表扬了^@^,也迎来了之后小小的高峰。。。
没有什么特别的期待,有人用,觉得有用大概就是对我最大的夸奖了。呵呵。欢迎提意见给我。
后记
1)听说豆瓣九点可以自动收录wordpress,我那叫一个后悔啊。新手不会玩豆瓣,sigh。
2)想要php调用douban Oauth的同学,可以参考我在wordpress.org上的代码,这可是汗水和泪水啊-,-
3)wordpress.org的缺点也很明显,一定需要wordpress.com的账号才能rate和vote,这导致基本没人回来给意见。
WordPress.org 地址
http://wordpress.org/extend/plugins/wp-douban-post/stats/
Douban应用小站 地址
http://site.douban.com/widget/notes/2324209/note/141570144/

WP-Douban-Post Stats 2011-03-26
在Linode上安装openVPN
一些朋友需要VPN访问一些墙外资源。本着服务器放着不用是浪费的原则我决定搭一个VPN服务器帮助解决朋友的需求。
不得不说Linode的文档非常齐全,而且很傻瓜,照着作一遍基本解决了所有的问题。
openVPN安装
Ubuntu方便是没话说的。
apt-get update
apt-get upgrade --show-upgraded
apt-get install openvpn udev
这就是所有你需要的软件了。安装包里提供了密钥工具包“easy-rsa”,把它拷贝到配置文件夹下。
cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn
修改工具包中的文件vars,按照你的需要配置相关信息
export KEY_COUNTRY="US"
export KEY_PROVINCE="OH"
export KEY_CITY="Oxford"
export KEY_ORG="Ducklington"
export KEY_EMAIL="squire@ducklington.org"
配置你的密钥体系
首先需要初始化PKI.
cd /etc/openvpn/easy-rsa/2.0/
source . /etc/openvpn/easy-rsa/2.0/vars
. /etc/openvpn/easy-rsa/2.0/clean-all
. /etc/openvpn/easy-rsa/2.0/build-ca
接着生成服务器私钥。会有一些问题和提示,选择默认和Y就可以了。
. /etc/openvpn/easy-rsa/2.0/build-key-server server
然后是生成客户端的证书.其中client1是证书的名字,你可以按照你的需要填写。如果需要生成多个客户端证书,重复该步骤就可以了。
. /etc/openvpn/easy-rsa/2.0/build-key client1
最后生成Diffie Hellman Parameters。
. /etc/openvpn/easy-rsa/2.0/build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
如果一切正常,会出现如上所示的信息。
密钥的配置基本就是这样,最后把生成的密钥文件和easy-rsa提供的服务器端配置文件样本拷贝到配置文件夹下。
cd /etc/openvpn/easy-rsa/2.0/keys
cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn
cd /usr/share/doc/openvpn/examples/sample-config-files
gunzip -d server.conf.gz
cp server.conf /etc/openvpn/
cp client.conf ~/
cd ~/
配置openVPN链接
密钥的配置保证了客户端和VPN服务器的链接。还要配置openVPN对网络包地转发规则。
修改/etc/openvpn/server.conf,添加如下语句
push "redirect-gateway def1"
修改/etc/sysctl.conf,添加如下语句
net.ipv4.ip_forward=1
为VPN会话添加下列变量。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
为了保证每次启动这边规则都生效,可以把后面四个语句添加到/etc/rc.local中去。
除了IP包地转发规则,我们还需要处理来自客户端的dns请求,安装dnsmasq来解决这个问题。
apt-get update
apt-get install dnsmasq
修改/etc/openvpn/server.conf,添加如下语句
push "dhcp-option DNS 10.8.0.1"
OK,一切搞定,启动openVPN服务吧。
/etc/init.d/openvpn restart
客户端的使用
Mac下的openVPN客户端
http://code.google.com/p/tunnelblick/
Windows下的openVPN客户端
http://openvpn.se/download.html
将上文生成的client.conf, ca.crt, client1.key, client1.crt拷贝到你的电脑,配合客户端使用即可。
参考连接
http://library.linode.com/networking/openvpn/ubuntu-10.04-lucid
推荐连接
有兴趣的朋友可以使用我的referral链接注册使用Linode,将获得10%的优惠。
http://www.linode.com/?r=513a31440dd0a6c0980cc05a164b4ae2520a19d6
WordPress搬家记
Hostmonster的两年租约转眼到期了。想当年4刀每月如今已经涨到了6刀每月,感慨之际只好把东西通通往Linode这边搬。希望这次可以坚持的更长。
Hostmonster上需要搬的也就一个wordpress,其中有经历了一些问题,记录下来也算是经验。
之前已经把domain transfer搞定了,所以主要就是程式的挪动。大致的搬家过程主要分三步。
数据库搬家
不得不说mysqldump还是很方便的。对于我这种要求不高,只求没数据遗留的人来说超级方便。
mysqldump wordpress > wordpress.sql
然后在linode上直接导入数据库就好了
mysql -u xxx -p
create database wordpress character set utf8;
exit
mysql -u xxx -p -D wordpress < wordpress.sql
WordPress搬家
我的hostmonster和Linode都开通了SSH服务。所以php文件搬家直接就是一句话的事情。
scp -rf blog/* xxx@tech4k.com:/path/
配置更新
wp-configs.php包含了wordpress的所有全局配置,搬过来以后要做对应的修改。我的域名没有变,所以只需要对数据库配置修改就可以了。
define('DB_NAME', 'xxxxxx');^M
^M
/** MySQL database username */^M
define('DB_USER', 'xxxxxx');^M
^M
/** MySQL database password */^M
define('DB_PASSWORD', 'xxxxxx');^M
^M
/** MySQL hostname */^M
define('DB_HOST', 'xxxxxxxx');^M
除了这三步之外还有一些小地方的注意事项,也许不适合你的案例,但是注意一下总归没错。
用户和用户组,以及权限
scp搬过来的所有文件的用户和用户组信息都会被修改,一开始完全没有办法更新插件。之后才发现这个问题的。这里的用户必须是apache的执行用户,这样才不会有问题。
chown -R aaa:xxx *
设置上传路径
在wordpress的管理界面中,需要设置一个上传路径,这样才可以自动从wordpress.org上自动下载插件。
Settings -> Media -> Store uploads in this folder
需要注意的是该文件夹需要权限配置可写。
sitemap.xml&sitemap.xml.gz配置
我使用了XML-Sitemap这个插件,方便好用。该插件需要根目录下的sitemap.xml和sitemap.xml.gz可写。
遗留问题
timer启动
理论上有些插件需要在插件激活的时候启动一些后台Timer定时完成任务的。不是很清楚我这样的搬家方法会不会对这种插件有问题。
Permalink配置
我现在的Permalink有问题。只能通过/?p=%post_id%来访问,不能通过/archive/%post_id%这种方式访问。添加了.htaccess也确认可写之后仍然有这个问题。还需要进一步研究。
搬家总是很麻烦,皑皑,感叹一下。
WP-Dict version 1.0.0 released
=== Plugin Name ===
Contributors: windlx
Donate link: http://blog.tech4k.com/
Tags: dict, translation, wp-dict
Requires at least: 2.8
Tested up to: 3.0.4
Stable tag: 1.0.0
Widget Plugin. A widget could help to translate between English and Chinese.Take advantage of the API from dict.cn.
== Description ==
Widget Plugin. A widget could help to translate between English and Chinese.Take advantage of the API from dict.cn. Implimented by Ajax.
== Installation ==
- Unzip wp-douban-post to the ‘/wp-content/plugins/’ directory
- Activate the plugin through the ‘Plugins’ menu in WordPress
- Add ‘WP Dict’ in through the ‘Widgets’ menu in WordPress
- Any problem, please contact windlx from my blog.
- 解压后将文件上传到’/wp-content/plugins/’目录
- 在插件中激活wp-dict
- 在Widget中添加WP-Dict
- 如有问题,请通过我的博客windlx联系我
== Frequently Asked Questions ==
= What do I need before the installation? =
You don’t need anything. Dict.cn API is open to everyone.
= Why I can’t see WP Dict Widget from my ‘Widgets’? =
There is a build issue before 2011/01/23. If you used to install it, please delete the plugin and reinstall it. Everything will be fine.
== Screenshots ==
1. WP-Dict
== Changelog ==
= 1.0.0 =
Get the Translation of the words by Ajax.
== Upgrade Notice ==
= 1.0.0 =
Basic Version.
WP-Douban-Post 1.0.0 Released
=== Plugin Name ===
Contributors: windlx
Donate link: http://blog.tech4k.com/
Tags: douban, post, douban-post
Requires at least: 2.0
Tested up to: 3.0.4
Stable tag: 1.0.0
Send one message to your douban broadcasting mysaying when you publish the post.
== Description ==
Send one message to your douban broadcasting mysaying when you publish the post.
== Installation ==
- Unzip wp-douban-post to the ‘/wp-content/plugins/’ directory
- Activate the plugin through the ‘Plugins’ menu in WordPress
- Visit WP Douban Post Options
- Click the button “Get Access Token”, it will open a new window for you to authorize WP Douban Post.
- Close the window after the authorization is done.
- The option page will refresh automatically. If everything works fine, you can see you Douban ID and access token.
- Next time when you publish the post, there will be one message sent to your Douban Broadcasting Mysaying.
- Any problem, please contact @windlx at Twitter.
- 解压后将文件上传到’/wp-content/plugins/’目录
- 在插件中激活wp-douban-post
- 访问WP Douban Post选项页
- 点击Get Access Token按钮, 会打开豆瓣网页,要求你对WP Douban Post应用进行授权。
- 授权结束后,点击Close按钮,关闭返回页面。
- 选项页会自动刷新,如果一切正常,页面会显示你的Douban ID, Acces Token和Access Token Secret.
- 如有问题,请通过新浪微博@windlx联系我
== Frequently Asked Questions ==
= What do I need before the installation? =
You need to have a Douban ID for authorization.
== Screenshots ==
1. WP-Douban-Post.
== Changelog ==
= 1.0.0 =
* Configuration Page in WordPress Admin
* Generate Douban Access Token
* Send one message to user’s Douban Broadcasting Mysaying when publish the post.
== Upgrade Notice ==
= 1.0.0 =
Basic Version.
WordPress插件开发入门心得
WordPress用了一段时间,有了一些自己的需求。于是硬着头皮就自己做起了插件。眼见0.1.0总算要release了。把这一周的新的体会记录下来。当作是总结。
插件入门
强烈推荐水煮鱼团队的系列文章(见下面的参考),第一篇非常清楚的描述了Wordpress 插件入门的步骤。其实就是一个附带规定格式备注的php。还能更容易么?
/*
Plugin Name: XXXXXX
Plugin URI: XXXXXXXX
Description: XXXXXXXXXXXXXXXXX
Version: XXXXXXXX
Author: XXXXXXXX
Author URI: XXXXXXXX
*/
把上面的信息保存到php文件中,把php文件放到wp-content/plugins/
Action and Filter
WordPress提供了丰富的API供开发者调用。其中核心的概念就是Action和Filter。
Action指的就是事件,发布博客,进入Admin页面,激活插件,这些都是action。Wordpress可以让开发者将这些action与自己实现的方法关联起来,从而在事件激发的时候能够完成自己的功能。
Filter指的就是过滤器。Wordpress可以让开发者通过注册filter的方式修改Wordpress地默认表现。例如自定义短链接,格式化标题等等。
参考资料中包含了Action和Filter的具体列表。
后台选项页
没想到如此的简单,三步就能完成。
一,注册Action,用户进入Admin页面的时候需要调用的方法。
add_action('admin_menu', 'plugin_name_options_admin');
二,用户进入Admin页面的时候需要具体显示的文字,注册打开选项页时调用的方法。
//Set option page for the plugin
function plugin_name_options_admin(){
add_options_page('wp_douban_post', __('XXXXXXXX, 'xxxxxxxxxxxxxx'), 5,
__FILE__, 'plugin_name_options');
}
三,实现打开选项页时调用的方法。
function wp_douban_post_options()
{
//页面提交需要实现的功能
if($_POST['update_doubanshow_option'])
{
$wp_doubanshow_option_saved = get_option("wp_doubanshow_option");
$wp_doubanshow_option = array (
"userid" => $_POST['userid'],
"apikey" => $_POST['apikey'],
"profile" => $_POST['profile'],
"collection" => $_POST['collection'],
"recommendations" => $_POST['recommendations'],
"powerby" => $_POST['powerby']
);
if ($wp_doubanshow_option_saved != $wp_doubanshow_option)
{
if(!update_option("wp_doubanshow_option",$wp_doubanshow_option))
{
$message = __('Update Failed', 'wp-doubanshow');
}
}
update_doubanshow();
echo $message ;
}
//这部分是显示的html
<div class=wrap>
<form method="post" action="">
<h2><?php _e('DoubanShow Options', 'wp-doubanshow'); ?></h2>
<fieldset name="wp_basic_options" class="options">
<table>
<tr>
<td valign="top" align="right"><?php _e('Douban ID:', 'wp-doubanshow'); ?></td>
<td><input type="text" name="userid" value="<?php echo $userID; ?>" /> <?php _e('Enter your Douban ID.', 'wp-doubanshow'); ?></td>
</tr>
</table>
</fieldset>
<p class="submit"><input type="submit" name="update_doubanshow_option" value="Update Options »" /></p>
</form>
</div>
}
比我想想的容易很多。轻松过了这关。
参数数据库保存
WordPress提供了get_option()和 c()两个方法,可以方便的保存选项页中的参数。
get_option
<?php echo get_option( $show, $default ); ?>
$show
(string) (required) Name of the option to retrieve. A list of valid default options can be found at the Option Reference.
$default
(mixed) (optional) The default value to return if no value is returned (ie. the option is not in the database).
update_option
<?php update_option( $option_name, $newvalue ); ?>
option_name
(string) (required) Name of the option to update. A list of valid default options to update can be found at the Option Reference.
newvalue
(mixed) (required) The NEW value for this option name. This value can be a string, an array, an object or a serialized value.
需要注意的是所有插件的option都保存在一张表,所以为了避免冲突,option名字需要格外当心。
后台定时任务
WordPress提供了简单机制使得插件可以完成定时更新之类的功能。示例如下。
//自定义Action,并注册相关function
add_action('my_event', 'my_function');
//定义Action的出发频率
if (!wp_next_scheduled('my_event')) {
wp_schedule_event( time(), 'hourly', 'my_event' );
}
//当插件被停止时候,移除相关Function
function update_deactivation(){
wp_clear_scheduled_hook('my_event');
}
register_deactivation_hook(basename(__FILE__),' update_deactivation');
总结
总之就是动手做,其乐无穷啊~~~~~~~~~
参考资料
WordPress Plugin API
Write a Plugin
Plugin API/Action Reference
Plugin API/Filter Reference
自己动手写 WordPress 插件
用 Eclipse PDT 开发一个 WordPress 插件
Liferay 6.0.5的定制
安装好了Liferay自然要玩耍一下。不过不管怎么玩都是人家的东西,要最后完成成自己需要的功能和样子,还需要自己去作二次开发定制。关于这方面的内容网上没有比较清晰的思路可以参考,于是自己写了一些方面,给以后留一些参考。
删除sevencogs
默认的安装包中提供了一个叫做sevencogs的示例站点。由于使用了Hooks Plugin,会和原装的liferay表现有所不同,所以如果你自己要做定制的话,最好把他们先删除。
rm -rf liferay-portal-6.0.5/tomcat-6.0.26/webapps/sevencogs*
配置Portlets
Liferay除了核心包中提供了很多实用的Portlet之外,还在liferay-portal-6.0.5/tomcat-6.0.26/webapps/下默认部署了很多强大的Portlets。具体的介绍可以参考下面这个页面。
http://www.liferay.com/zh/community/wiki/-/wiki/Main/Liferay+Portlets
个人的建议是不需要的话先删除,反正之后需要了也可以再添加回来。这样服务器启动也可以迅速不少。
配置MYSQL
默认的Liferay使用的嵌入式数据库HSQL,不过你启动的时候Liferay也会提醒你不要太当真,真要用了一定要修改数据库配置。
首先,在mysql中创建数据库。
create database lportal character set utf8;
然后修改下面这个文件(如果没有就创建)。
liferay-portal-6.0.5/tomcat-6.0.26/webapps/ROOT/WEB-INF/classes/portal-ext.properties
在其中添加一下配置(以MYSQL为例)
jdbc.default.driverClassName=com.mysql.jdbc.Driver
jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
jdbc.default.username=
jdbc.default.password=
之后Liferay启动的时候就会自动读取这个配置文件以对应的数据库配置启动了。如果数据表没有创建过还会贴心的帮你创建并且导入基础数据。
具体各种数据库配置示例可以访问下面的链接。
http://www.liferay.com/zh/community/wiki/-/wiki/Main/Database+Configuration;jsessionid=F70539C702464D413394D1A66428E3EC.node-1
自定义布局和主题
Liferay的外观修改主要分成两个部分Layout和Theme.
Layout指的是布局。页面上每个Portal的大小和相对位置都是通过Layout进行定义的。
Theme指的是主题。页面的图片,HTML风格都是由Theme来决定的。
创建Layout
在最新的Liferay IDE 1.1.0中可以方便的创建Layout Plugin来对这个部分进行定制。
1)创建项目
File ->New Liferay Plug-in Project -> Plug-in Type: Layout.
IDE会创建一个“项目名称-layoutpl”的项目。
2)部署项目
Liferay Server-> Add or Remove -> 选择该项目。启动Liferay -> Server
部署的时候会把项目文件拷贝到liferay-portal-6.0.5/tomcat-6.0.26/webapps/下,然后会被Liferay侦测到,加载到系统中。
3)选择新布局
用管理员帐号登录后,可以通过 Manage -> Page Layout 选择你新开发的布局。
创建Theme
Liferay IDE 1.1.0中同样可以方便的创建Layout Theme来对这个部分进行定制。
1)创建项目
File ->New Liferay Plug-in Project -> Plug-in Type: Layout.
IDE会创建一个“项目名称-theme”的项目。
2)部署项目
Liferay Server-> Add or Remove -> 选择该项目。启动Liferay -> Server
部署的时候会把项目文件拷贝到liferay-portal-6.0.5/tomcat-6.0.26/webapps/下,然后会被Liferay侦测到,加载到系统中。
3)选择新布局
用管理员帐号登录后,可以通过 Manage -> Page -> Look and Feel 选择你新开发的主题。
需要注意的是Liferay支持每个页面配置不同的主题。
创建Portlet
这是大家讨论最多的部分。这边就不细说了。
唯一值得一提的是Liferay开发Portlet支持Plug-in和Ext 两种开发模式。具体的好坏我会以后有机会单独叙述。
为控制面板创建Portlet
除了给每个页面(Page)配置Porlet之外,经常也会有需要为个人控制面板添加Portlet功能。例如我的喜好,我的兴趣,我的足迹之类的功能。
Liferay中控制面板也可以视为一个特殊的页面,左边的菜单栏是一个特殊的Portlet,它会把所有需要显示在控制面板中的Portlet罗列出来。右边则是Portlet点选之后显示的内容。
一个Portlet如果需要显示在控制面板中,需要在
<control-panel-entry-category>my</control-panel-entry-category>
<control-panel-entry-weight>14</control-panel-entry-weight>
control-panel-entry-category指的菜单项的分类,包括’my’, ‘content’, ‘portal’ and ‘server’四种。control-panel-entry-weight指的是菜单项在该分类中的相对位置。
需要注意的是可能会出现常见问题一中的错误。
常见问题
1)Error on line 13 of document : The content of element type “portlet” must match
liferay-portlet.xml对顺序也有一定的要求。最简单的方法就是参考ROOT下的liferay-portlet.xml依样画葫芦,肯定不会错。
liferay 6.0.5 开发环境的搭建
最近在玩liferay,非常赞的一个门户搭建工具。不仅提供了开发工具包,和服务器的捆绑包,论坛和文档的质量也都非常高,最重要地是还有非常多的插件支持。绝对是开发Portlet上佳选择。
记性不好,记下来,说不定啥时候就要用到了。
前提
安装Java JDK 1.5+.
1)下载安装文件
liferay-portal-tomcat-6.0.5.zip捆绑了liferay和tomcat,让你不用省心不少的体贴服务。
liferay-plugins-sdk-6.0.5.zip用于开发liferay plugin的SDK。
liferay-ide-eclipse-updatesite-….zipEclipse 插件,功能强大的liferay plugin开发工具包。
2)在本地解压缩
我个人喜欢把所有相关的安装文件都放在一个目录下。
mkdir liferay
unzip liferay-portal-tomcat-6.0.5.zip
unzip liferay-plugins-sdk-6.0.5.zip
3)开发工具包的安装
使用的是Eclipse 3.5,低版本的请相应查找安装方法。
3.1)安装liferay插件
Install New Software -> Add -> Archive ( 选择liferay-ide-eclipse-updatesite-1.1.0.zip)->逐步安装。
3.2)设置liferay SDK
Preference -> Liferay -> Installed SDKs -> Add (选择liferay-plugins-sdk-6.0.5.zip的解压缩文件夹位置)。
3.3)设置liferay服务器
Preference -> Server -> Runtime -> Add -> Server Type ( Liferay v6.0) -> 选择liferay-portal-tomcat-6.0.5.zip皆压缩位置。
3.4)重启一下。
开发工具包就安装好了。感谢Eclipse强大的插件架构和liferay细心的服务。
4)测试使用
1)添加服务器
在Liferay的Perspective下,Servers -> New Server -> Liferay v6.0.
2)运行服务器
Liferay v6.0 -> Start
3)访问http://localhost:8080/
4)用test@liferay.com/test登录。
使用心得
Liferay Plugin Project 创建的时候会执行一些ant脚本。所以如果你需要使用版本管理的时候,个人建议不要check
in项目控制文件(.project, .classpath),这样你的同伴检出的时候可以通过创建新项目完成这些脚本的执行。避免不同步的现象发生。
参考文章
LifeRay安装配置开发环境全过程(一)
Eclipse – Liferay Wiki
【原创】Liferay Portal二次开发指南(总览)
Liferay Portal 6学习笔记3:Liferay IDE的安装使用

Recent Comments