在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)
{}
第二个参数是 module
的 ID
,命名是根据此参数。因此 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
发表回复