我们目前正在设置集成服务器,在此过程中我们在SVN上设置了预提交挂钩,这样我们的开发人员就无法检查语法无效的文件(主要是PHP和XML).
我们还有一堆.sql文件(对于MySQL),我也想提到它们.不幸的是,谷歌没有提出任何有用的任务.
有任何想法吗?
在Mysql中搜索用于语法linting的CLI工具以便在Jenkins中使用并且没有找到任何快速的东西(这个Stackoverflow问题是最初的结果之一 - LOL)我提出了以下解决方案(操作系统:Linux,但应该是也适用于Windows):
像下面这样的东西:
lint_result=`mysql mysql_test -B -f -e 'select asdf s where x;' 2>&1`; if [ `echo $lint_result | sed -r "s/ERROR ([0-9]*).*/\1/g"` -eq 1064 ]; then echo -e "Syntax error:\n${lint_result}"; fi Syntax error: ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where x' at line 1
(要检查sql文件,可以使用" 如果mysql无法解析查询的语法,则声明:第1行的ERROR 1064(42000):SQL语法中有错误; 检查与MySQL服务器版本对应的手册,以便在第1行的''附近使用正确的语法 只有在语法正确的情况下,它才会尝试执行查询并意识到表不存在,但这不再有趣了: 因此,错误1064是无效的语法.您只需创建一个空的测试数据库,因为否则只会出现错误的FROM部分错误(例如,为了获得有效的语法检查结果,需要数据库:'从s中选择asdf,其中x和if;). 据我测试,它工作正常(版本Mysql 5.5). 这里有一个完整的bash脚本版本:ERROR 1146 (42S02) at line 1: Table 'mysql_test.s' doesn't exist
#!/bin/bash
source_dir=${1};
database="mysql_test";
mysql_args="-h127.0.0.1";
mysql $mysql_args -B -e "DROP DATABASE IF EXISTS $database; CREATE DATABASE $database;";
for file in `find $source_dir -name "*.sql"`; do
lint_result=`mysql $mysql_args $database -f -b < $file 2>&1`;
if [ "`echo $lint_result | sed -r \"s/ERROR ([0-9]*).*/\1/g\"`" = "1064" ]; then
echo -e "Syntax error in file ${file}:\n${lint_result}" && exit 1;
fi;
done
MySQL Workbench 的商业版本有一个MySQL语句的语法检查器,但当然这只会涵盖数据库方面.请参阅http://mysql.com/products/workbench/(尽管我在免费应用程序的帮助索引中找到了factoid).