美文网首页程序员
跨平台代码换行符的问题处理

跨平台代码换行符的问题处理

作者: heyikan | 来源:发表于2019-04-01 20:18 被阅读0次
    主题封面

    背景概述

    通常,我们使用git做源码版本控制,在windows平台开发源码并进行单元测试,然后打包部署到linux平台进行集成测试或系统测试。

    除源码之外,我们会为部署写一些自动化的脚本,方便服务的启动和关闭。由于脚本文件是直接打包并上传到linux平台的,而windows平台和linux平台的换行符不同,这就导致了脚本在linux平台上执行错误。

    相关操作

    如上图所示,在默认的情况下,git远程仓库(Linux)的代码换行符是LF(linux平台换行符),通过git clone或git pull将代码拉到本地(windows平台),git会自动将换行符替换成CRLF。本地代码通过git push推送到远程仓库,git又会自动替换成linux换行符。
    另外,IDEA新建文件,默认也是使用平台的换行符,即windows平台使用CRLF。

    在测试阶段,需要频繁的更新文件,脚本也不便单独部署,手动解决换行符的问题(IDEA上可以做)比较低效。

    本文就这个问题给出解决方案。

    方案一:别给我改

    问题出现的原因,是因为git和IDEA考虑了平台换行符的兼容性,其实以LF换行的文件,在windows也可以良好的识别。所以我们可以修改git和idea的行为,不让它更改换行符。

    git有两个配置项,与换行符相关:

    core.autocrlf
        - true    提交时转换为LF,检出时转换为CRLF(默认行为)。
        - false   提交检出均不转换。
        - input   提交时转换为LF,检出时不转换
    
    core.safecrlf
        - true    拒绝提交包含混合换行符的文件
        - false   允许提交包含混合换行符的文件
        - warn    提交包含混合换行符的文件时,给出警告
    

    因为我们只是想确保本地的代码也使用LF换行符,并不打算改变远程仓库的换行符,所以建议设置如下:

    core.autocrlf=input
    core.safecrlf=true
    

    IDEA上也可以设置,新建的文件使用的换行符:

    idea的设置

    这些设置并不能改变已有文件的换行符,最直接的方式是把本地仓库删除掉,重新从远程仓库拉代码。

    但是这个方案存在着一定的难度和隐患。说难,是因为需要在团队内部进行宣贯,确保每个人都按照这样做了;说隐患,是新员工未必能及时遵守这个规定,或者在重新安装软件的时候,又恢复到了默认的设置。

    不过,这并不算什么大事情,只是有点麻烦。

    方案二:让脚本改

    之所以要修改换行符,是因为我们要部署到linux平台上去用,那么可以让打包脚本统一修改文件的换行符。

    借助于dos2unix工具,脚本可以直接调用命令,将要修改的文件路径作为参数。要递归修改某个目录,也可以通过shell脚本来实现。

    首先,从链接下载工具,放置到合适的目录。

    通过类似于下面的命令,实现递归修改文件:

    find D:/projects/release_dir -type f ! -name "*.jar" | xargs dos2unix.exe
    
    # find:搜索文件系统
    # -type f:限定文件
    # !:逻辑非
    # -name:匹配文件名
    

    这个方案直接面对问题进行处理,不和平台之间换行符转换的问题进行纠缠,也不必要求同事进行各种设置。只一条:通过打包脚本来打包。

    而一般情况下,我们都乐于使用打包脚本来自动打包,所以这一条也没有给开发人员添加任何负担。

    总结

    我更推荐使用第二种方案,它显得轻量小巧,不和其他问题纠缠夹杂,干净利索。

    相关文章

      网友评论

        本文标题:跨平台代码换行符的问题处理

        本文链接:https://www.haomeiwen.com/subject/dppbbqtx.html