iTop插件命名大小写引发的问题

在Windows上开发 iTop 插件,新增了一个 module,本地测试正常,但是上传到 LInux 系统的服务器上,却怎么也不生效,查看 env-production 下编译的结果,发现有两个 model.xxx.php 格式的文件,不同的是,一个文件名大写,一个小写,编译的代码更新到了大写的文件夹下,小写的没有内容。

model.OPS-Test.php
model.ops-test.php

查看 Windows 开发环境的 env-production ,只有一个 小写的。因为 Windows 文件名不区分大小写,基本可以确定是文件名大小写的问题引发的。

那么,为什么会编译生成一个大写的 model 文件呢?查看 module.ops-test.php 定义:

SetupWebPage::AddModule(
    __FILE__,
    'Ops-Test/1.0.0',
    array(
        ...
        'datamodel' => array(
            'model.ops-test.php',
            'main.ops-test.php',
        ),
        ...

可知程序是根据 AddModule 的第二个参数去生成编译后的 model 文件,并不是 datamodel 里的文件名,datamodel 里只是列出应该使用哪些 model 文件。查看 AddModule 函数定义:

/**
 * @param string $sFilePath
 * @param string $sId
 * @param array $aArgs
 *
 * @throws \Exception for missing parameter
 */
public static function AddModule($sFilePath, $sId, $aArgs)
{}

第二个参数是 moduleID,命名是根据此参数。因此 datamodel 里的文件名应该和此 ID 保持一致。

吐个槽,既然固定生成一个 model.$sId.php 文件,直接在 datamodel 数组里省略作为默认行为不就好了。

处理此问题时引申出一个问题,git 文件名大小写。由于改 module 的 ID 会导致需要重新安装此插件,决定将 datamodel 数组里的 model 文件改为和 ID 一致。即小写改大写。但是 git 默认是不区分大小写的,改名之后 git status 不显示变更。需要设置 git 区分大小写:

git config core.ignorecase false

然后就可以看到有文件新增了。提交之后,代码仓库将同时有 大小写 的两个 model 文件,此时需要删除小写的:

git rm --cached model.ops-test.php

--cached 参数和不加的区别是:

  • 需要删除暂存区分支上的文件, 同时工作区也不需要这个文件了, 可以使用 git rm
  • 需要删除暂存区分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以加 --cached 参数

具体到本例,直接 git rm 会把大写的 model 文件也删除,加 --cached 参数后则保留本地文件,且在 cache 里是大小写都有的,可以单独删除一个。

$ git ls-files --cached
...
README.md
readme.md

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注