在Windows上开发 iTop 插件,新增了一个 module,本地测试正常,但是上传到 LInux 系统的服务器上,却怎么也不生效,查看 env-production
下编译的结果,发现有两个 model.xxx.php
格式的文件,不同的是,一个文件名大写,一个小写,编译的代码更新到了大写的文件夹下,小写的没有内容。
1 2 |
model.OPS-Test.php model.ops-test.php |
查看 Windows 开发环境的 env-production
,只有一个 小写的。因为 Windows 文件名不区分大小写,基本可以确定是文件名大小写的问题引发的。
那么,为什么会编译生成一个大写的 model 文件呢?查看 module.ops-test.php
定义:
1 2 3 4 5 6 7 8 9 10 |
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
函数定义:
1 2 3 4 5 6 7 8 9 |
/** * @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 区分大小写:
1 |
git config core.ignorecase false |
然后就可以看到有文件新增了。提交之后,代码仓库将同时有 大小写 的两个 model
文件,此时需要删除小写的:
1 |
git rm --cached model.ops-test.php |
加 --cached
参数和不加的区别是:
- 需要删除
暂存区
或分支
上的文件, 同时工作区也不需要这个文件了, 可以使用git rm
- 需要删除
暂存区
或分支
上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以加--cached
参数
具体到本例,直接 git rm
会把大写的 model
文件也删除,加 --cached
参数后则保留本地文件,且在 cache 里是大小写都有的,可以单独删除一个。
1 2 3 4 |
$ git ls-files --cached ... README.md readme.md |
发表回复