windows下基础开发环境搭建

2016年5月28日 开发 No comments , ,

工作需要在windows环境下搭建一个基础开发环境,在此记录一下:

一、注意事项

  1. 以下的安装配置方法仅支持win7/8/10之类的系统,xp可以洗洗睡了。
  2. 装了cmder-full(With git-for-windows)版或者babun就没有必要安装git-for-windows了,不过从兼容性角度出发,建议还是使用cmder-full的版本,至少纯windows的环境下也能直接使用git指令,也支持外部ide调用。
  3. babun(cygwin)是调整过的cygwin环境,cmder默认是windows环境(可以安装chocolatey做包管理)两个环境面对的场景不同,choco安装的软件基本都是port到win环境下的版本,和babun的cygwin环境下的版本配置方式不一样,看各人喜好,可以分别使用,也可以只使用一个。
  4. linux的家HOME目录用~字符来标识,windows下通常对应的就是C:\Users\Administrator目录

二、终端环境

推荐使用cmder(With git-for-windows) + babun(cygwin)预配置环境的方式,既有普通cmd终端的linux化,又支持cygwin环境安装使用你所需要的linux环境安装包

  1. cmder-full(With git-for-windows)下载后解压缩到磁盘,(推荐c:\opt\cmder)
  2. 加入系统环境变量PATH环境变量中追加c:\opt\cmder路径。
  3. 注册右键菜单:以管理员身份启动命令行提示符(cmd),然后进入c:\opt\cmder路径后执行:

  1. 提示符配置:修改cmder目录下的config\cmder.lua的第2行把λ替换为$,更符合日常linux下用户prompt的习惯。

  1. 常用别名配置:修改cmder目录下的config\alias文件,在最后加入常用的alias,比如:

6.中文字间距问题,启动cmder后win+alt+p呼出设置面板去掉 monospace 选项(点两下让勾选框留空),然后save settings保存设置。
7. 可选(安装chocolatey windows包管理器),打开cmder/cmd终端,执行以下命令:

  1. 安装babun的环境:下载babun官网上的安装包,解压后执行其中的install.bat批处理文件
  2. 配置整合babun环境到cmder工具中:启动cmder后win+alt+p呼出设置面板(Settings),然后打开 Startup>Tasks面板点+号添加一个task,名称输入babun,
    Task parameters中输入:

下面的Commands大输入文本框中输入:

save settings保存设置,然后你可以按up或down的按钮把{babun}的顺序调到{cmd}的前后,也可以勾选Default task for new console和Default Shell选项来把它作为默认console。注意,如果新开窗口想默认用{babun},需要修改Startup面板中的Specified named task不选{cmd}而是新的这个{babun}
10. 修改babun的环境配置:cmder启动后打开{babun}的终端后编辑~/.zshrc文件:

修改ZSH_THEME=”babun”为ZSH_THEME=”ys”,后保存退出,然后关闭终端后再启动{babun}终端即可。
11. 如果你还是习惯mingw的git-bash环境也可以在cmder工具中添加配置:启动cmder后win+alt+p呼出设置面板(Settings),然后打开 Startup>Tasks面板点+号添加一个task,名称输入gitbash,
Task parameters中留空
下面的Commands大输入文本框中输入:

save settings保存设置即可,后续的就可以启动{gitbash}终端使用了。

至此你已经完成了windows下终端环境的配置,启动cmder后,
{cmd}的task为windows上下文命令行:使用choco作为包管理器
同时也支持一些基本的linux命令比如ls,curl之类的,软件包管理可以使用chocolatey的choco指令,

{babun}的task为cygwin上下文命令行:使用pact作为包管理器

注意{babun}的cygwin环境上下文中的安装的包不能在windows上下文环境中使用,(比如这里安装的php指令在windows环境下则会报招不到php指令),但windows上下文环境中安装的软件可以在cygwin环境下最后被搜索到则调用,注意是调用,效率比较低,而且也无法控制执行,所以通常情况下的windows指令还是推荐在{cmd}终端中执行。

  1. 命令行生成私钥公钥对:

默认生成的文件在~/.ssh路径下的id_rsa(私钥)和id_rsa.pub(公钥),id_rsa.pub可以添加到代码托管环境的个人公钥列表中去

  1. 设置个人基础的git信息:

三、开发环境(virtualbox+ vagrant[homestead]|docker[laradock])

  1. 安装 virtualbox和其下载页面的Oracle VM VirtualBox Extension Pack扩展包
  2. 安装vagrant工具
  3. 以vagrant(homestead)为例子构建开发环境:
    {cmd}命令行输入:

下载比较慢,你可以在这里:
https://atlas.hashicorp.com/laravel/boxes/homestead
查到版本号,然后手工下载官方的链接,比如0.4.4的版本:
https://atlas.hashicorp.com/laravel/boxes/homestead/versions/0.4.4/providers/virtualbox.box
注意部分下载工具比如迅雷可能会导致下载的box文件损坏从而无法导入。
下载好后,放到可以被当前用户命令行访问到的地方然后执行:

/Path/to/Homestead.box就是你下载的box文件的完整访问路径。
导入成功后此时的box是没有版本信息的,你需要手工修正这个版本的问题:

将0目录改名成0.4.4名称
然而此时的手工添加的方式没有升级信息需要手工添加metadata_url这个文件到系统下:

内容输入:

注意如果是手工编辑的此文件,不要有任何形式的回车换行符和空格等无效内容,保存后退出vim
接下来就可以开始homestead的基础安装了,返回到$HOME路径:

你也可以使用我定制过的版本
【首次provision的时候,你网络没问题的话,自动帮你搞定以下问题】

国内apt源

oh-my-zsh安装配置

略调整过的vim环境配置

composer环境加 中文源

laravel-envoy部署工具、laravel命令行工具、box(phar打包工具)

psysh 交互式php命令行工具

cnpm 国内源npm

phpunit命令行工具

命令行代理服务、工具privoxy proxychains

命令行科学上网工具,shadowsocks(sslocal/ssserver)+配置更新脚本 (懂得同学最好还是换成自己的配置/home/vagrant/etc/shadowsocks.json,并注释掉/etc/cron.d/ssupdateinfo中的对配置更新脚本的调用/home/vagrant/bin/upssinfo.sh)

喜欢折腾的童鞋可以fork我的改版后自己修改 scripts/pre-setup.sh和scripts/post-setup.sh脚本。

然后进入~/Homestead后执行:

这个步骤会自动生成
~/.homestead/Homestead.yaml的虚拟机配置文件,根据你自己的需要做对应的定制,比如我的:

注意的一点是~/Code也就是C:\Users\Administrator\Code目录不能是软链的目录而必须是实体目录,否则在virtualbox挂载的时候会报错。
然后回到~/Homestead执行:

执行首次启动的provision流程。
后续的执行只需要vagrant up即可。vagrant halt关闭虚拟机。
如果provision的过程中网络出现问题等其他虚拟机被弄乱的情况还可以 vagrant destroy –force来强行删除掉虚拟机,再vagrant up来重新provision一遍。
其他homestead的安装细节可以参考:http://laravel-china.org/docs/5.1/homestead

  1. 如果你比较熟悉docker也可以安装新的docker-tools集成docker工具集
    安装的时候,前面你已经独立安装过了virtualbox和cmder(git-for-windows)所以此处安装时,请不用勾选 VirtualBox和Git for Windows两个选项
    docker-setup
    安装路径,推荐改为C:\opt\docker-toolbox 方便后续命令行操作时的输入。

  2. 集成docker的启动命令:
    在cmder工具中添加配置:启动cmder后win+alt+p呼出设置面板(Settings),然后打开 Startup>Tasks面板点+号添加一个task,名称输入docker,
    Task parameters中输入:

下面的Commands大输入文本框中输入:

save settings保存设置即可,后续的就可以启动{docker}终端使用了。
另外如果docker-toolbox安装时是独立安装的git-for-windows(像我们前面描述的这样)需要手工修改桌面和开始菜单中的快捷方式Docker Quickstart Terminal,把目标程序的命令行内容改为:

  1. 以docker(laradock)为例子构建开发环境
    你可以clone官方的版本:

然后修改docker-compose.yml配置文件中的application的volumes设置:

改为:

也可以直接clone我改好的版本

然后可以把Code下 前面构建好的homesteadapp做个软链到dockerapp,这样可以只用一套代码

最后初始化docker环境:

剩下的调整配置、和使用部分可以参考官方文档:https://github.com/LaraDock/laradock

其他推荐软件

以下软件都可以用 chocolatey windows下的命令行包管理器 来安装,安装/卸载软件并不需要用到那些什么软件管理专家了。
1. wox windows下类似于mac的alfred的快速启动工具,有了它记得软件、目录名字就可以了,忘了开始菜单吧。
2. everything windows下的文件搜索工具,这个就不用多说了吧。

基于Laravel Envoy的部署脚本

2015年7月21日 laravel, 开发 No comments , , , ,

如题,找了半天貌似都没有符合laravel的天朝网络环境的的部署脚本,
于是乎结合参考了多个部署脚本和工具的理念又造了个新轮子:

https://github.com/nickfan/envoy-deployscript

使用说明见:https://github.com/nickfan/envoy-deployscript/blob/master/README.zh-CN.md

欢迎大家测试吐槽。

主要特点:

支持本地构建打包部署

支持工作拷贝本地构建依赖模块(vendor目录)

原理/设计规划

你的 $deploybasepath 远程部署基础路径将会看起来像如下这样(如果你有多个子应用在同一个部署基路径里).

你的 $deploybasepath/$appname 远程部署应用路径将会看起来如下.

正如你所见的, current 目录是软链到最近一次的部署目录的

在你的部署目录中文件列表看起来像下面这样(只列举了部分文件做例子):

部署目录中的.env文件和storage文件夹都软链接到了上级应用目录中的公共文件/文件夹了,这样部署本身只部署源代码和vendor等依赖环境, storage等公共数据在shared文件夹中并不随代码部署,节省了空间也保留延续了日志/应用cache等相关基础数据在应用中的使用

 

一个简单的php守护进程代码示例

2015年7月8日 开发 No comments

工作中同事需要做一个简单的工作进程,需要在进程结束时不能被硬生生的掐断当前正在执行的工作流程,需要等一个处理流程跑完了再结束,所以这时候就需要用到pcntl的信号量来工作了,主要的设计思路:

  1. 捕获系统发给进程的中断的信号量
  2. 在handler代码中设置标志位变量
  3. 在一个业务循环处理完成之后判断标志位变量,如果接收到过终止请求,则跳出整个工作循环。

主要的处理逻辑:

  • 注册绑定函数:

  • 在函数中设置标志位:

  • 构建退出处理函数

  • 在主循环中一次处理完成后判断是否要终止退出

 

附上完整代码(loop是示例需要长时间处理的业务逻辑,memoryusage超限也会退出,外部可以由supervisor/daemontools等进程监控程序控制)

也可以到我的coding上下载:

https://coding.net/u/nickfan/p/mydevkit/git/blob/master/bin/daemon

测试:

在class代码中的构造函数中注释掉

运行daemon代码,在执行execute的for循环时ctrl+c或者用 kill 杀死当前进程

Snip20150708_1

进程直接结束,没有执行完execute的一个完整流程就直接退出了,

把注释去掉重新执行daemon代码:

Snip20150708_2

在执行过程中按ctrl+c或者kill命令杀死前进程

观察daemon运行的结果是直到整个execute循环执行完了以后才退出程序的

 

laravel的oauth2-server相关开发的备忘

2015年7月1日 laravel, 开发 No comments , ,

开发当中踩了不少坑,做个备忘。

代码环境:

laravel 5.1

oauth2-server服务组件:

lucadegasperi/oauth2-server-laravel 也就是 thephpleague/oauth2-server 的laravel 包装版本

目前插件的版本是~4.1

需要注意的点是:

一般而言最常见的应用场景是grant_type为authorization_code的情景,

thephpleague的oauth2-server要求的数据提交必须是POST数据编码方式是application/x-www-form-urlencoded,默认情况下如果你用的是curl组件会以multipart/form-data模式编码提交的post数据,所以后端提交请求的时候注意一下,
如果你用的是curl,需要设置:

如果你用的是GuzzleHttp的组件:参考官方的说明

其他的基础配置设定,插件作者的wiki中已经有了说明,我这里做了一些自己的设定:

  • 不想关闭全局的csrf保护咋办?

如果你是直接安装的laravel 5.1版不要关闭全局$middleware的csrf:

按wiki中的说明添加$routeMiddleware中的设定:

在你的\App\Http\Middleware\VerifyCsrfToken类中的$except变量添加:

也就是:

  1. 你的oauth服务获取access_token的入口地址,如果你换了地址修改这里对应的设置即可。
  2. 你使用oauth中间件保护的服务接口也不需要csrf做多余的防护,在此排除掉 api/* 这对应的前缀即可

如果是5.0之类的升级上来的,VerifyCsrfToken可能还是老的写法,不支持$except,自己改造一下符合新版规范:

 

  • 本地登录授权的页面(View::make(‘oauth.authorization-form’))该怎么写?

原来官方的wiki中没有,放狗找了一圈的issue list才凑合着写了一个放了上去,作者插件的wiki里我已改过了:

注意提交的form原先GET请求中的querystring是需要一并post的 这个坑要注意一下。

而对应的$params在controller中的设置:

最后在你被oauth保护的api接口中你就可以获得到对应的当前用户id了:

 

世界,你好!

2015年3月10日 未分类 No comments

再一次搬家,其实写博客在现代而言已经貌似成为了史前人类的习惯,之前博客的数据也感觉鸡肋,索性清空自己重头来过。