跳到主要內容

PHP CodeSniffer with Custom Rule

程式碼的靜態分析是 team work 或者 CI 中很重要的一個環節
而靜態分析,其中的一項功能 coding standard 和 coding style的分析更是可以保護你的眼睛

squizlabs/php_codesniffer 內建有許多 ruleset, 像是 PHPCS, PSR2, PSR1, Squiz, PEAR, Zend etc...

如果你仔細去看每個 Standards 目錄下的 ruleset.xml 和 Sniffs 目錄大概就可以看出
其實他們是互相 include, 然後在自己的 Sniffs 裡做 Overide 或者是定義自己的新規則

例如 PSR2 的 ruleset.xml 裡面就宣告了 reference rule 是 PSR1
而 PSR1 又 include 了像是 Squiz 之類的
如果因為某些歷史/framework 的因素, 你希望盡可能地採用 PSR2, 但是又希望 exclude 掉其中的某一部分, 例如 PSR0 

這時候你可以在 Standards 目錄下建立自己客製化的 ruleset, 目錄裡面只要放 ruleset.xml 
內容是 reference PSR2, 再另外加上你想 exclude 掉的 rule.

但是你要怎麼知道有那些 rule 可以 exclude 呢?
以你想套用大部分的 PSR2 ruleset, 但是又想 exclude 掉 PSR 0 為例.

我們知道 PSR2 引用了 PSR1, 而 PSR1 裡面又包含了 PSR0
所以 Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php 裡面會檢查 class 有沒有正確宣告 namespace

想 Exclude 掉這個 rule 的話, 我們可以從目錄拆解出 rule name:
"PSR1.Classes.ClassDeclaration"

大概就是這樣啦~
透過客製化自己的 ruleset, 然後再設定 sublime linter 裡的 code sniffer.
就可以馬上讓你的知道, 自己寫的 code 有沒有符合規則.

畢竟在一開始的時候, 我們可能還沒辦法完全的熟悉 PSR2 的所有細節
就讓 code sniffer 來告訴你吧!

留言

這個網誌中的熱門文章

Access private API gateway from another account

最近在做一個 PoC 驗證說怎麼在現有的架構下,把一些 public API 移到 VPC 裡面,只讓特定網路的人可以存取。 當然最直覺的想法就是,建一個新的 VPC ,加上 execute-api VPC endpoint 然後這個 VPC 再跟特定網路做 Peering,建一個 Private API Gateway 在新的 VPC 裡面。 這樣新的 VPC 可以透過 VPC endpoint 去存取 API Gateway,然後再加一個 ALB ,裡面的 target group 指向 VPC endpoint 的 IP和 443 port,ALB 設定好 Domain Listener,API Gateway 也加上相同的 Custom Domain Name,這樣子 ALB 就可以當成特定網路 access 的 entry point,一但 Peering 完成後,從特定網路來的 request 就可以經由 ALB -> API GW 跨 VPC 存取原本環境的 backend resource。 但我一直在想,Peering 是必要的嗎? 沒想到隔天就看到這個教學  How can I access an API Gateway private REST API in another account using an interface VPC endpoint?  裡面的做法突破了原本我直覺上的盲點! 就是即使是 Internal API Gateway 似乎只要設定好了 resource policy 就可以允許其他 account 的 VPC endpoint 跨帳號存取! 所以例子裡面的 private API Gateway 是建立在 B 帳號裡面,A 帳號的 VPC 只是啟用了 VPC endpoint,一但 B 帳號的 private API Gateway 在 resource policy 設定好允許 A 帳號的 VPC endpoint 存取,即使兩個帳號之間沒有 peering 也是可以互通的! 雖然說這樣子要帶 hostname header or api-gw-id 但是 原本架構上的 ALB 也是為了 VPC endpoint 可以知道要 forward request 給哪個 API Gateway ...

全球鷹/響尾蛇 D300 行車記錄器

全球鷹 Global Eagle /響尾蛇 D300 行車記錄器 前後雙鏡頭,透過電瓶的壓升壓降來開啟/關閉行車記錄器主機 wifi 是 mmcx 接頭,去淘寶買一條 20 元 預設 wifi 密碼是 12345678 透過 TimaCam 可以 wifi 連線主機,用來看即時鏡頭畫面還可以 但是要下載一個片段 216MB 非常慢,讓我看到噪音管和吐白煙的想檢舉也覺得麻煩... 主機拆下後,即使透過 USB 供電也無法開機, 要操作主機只能發動機車在車子旁邊操作, 主機沒接線的裝態也不能直接拿來看錄影檔。 從 2018.3 月安裝到現在,發生過一次熄火吃完飯(約20分鐘),竟然沒關機還在錄影。還好只是 20 分鐘,不然電瓶的電不知道會不會被吃完。 現在都很提心吊膽,熄火後都會等他壓降關機後(約 1 分鐘)才會離開。 早知道還是裝一般開電門供電,關電門關機的機種。 wifi 看檔和安裝容易都只是噱頭,買了才知道難用。

Publish lambda layer to regions from s3 bucket?

boto3 有個  publish_layer_version  API,你可以使用 S3 bucket + key or zipfile 來發布 lambda layer. 使用 zipfile 的話就是從命令執行端上傳,所以假設你的 lambda packet 是 20MB 然後你要發佈到 16 個 AWS region 的話,就看你命令執行端的網路上傳速度了。 使用 S3 bucket 來放要發佈的 zipfile 檔似乎比較合理,因為這樣子檔案的複製就是在 AWS 的網路內發生。 But... 很機車的是,如果你的 zipfile 是放在 us-west-1 的 S3 bucket 那麼你就只能發佈到 us-west-1 .... 當你要發佈到其他 region 會出現 error botocore.errorfactory.InvalidParameterValueException: An error occurred (InvalidParameterValueException) when calling the PublishLayerVersion operation: Error occurred while GetObject. S3 Error Code: PermanentRedirect. S3 Error Message: The bucket is in this region: us-east-1. Please use this region to retry the request S3 bucket name 是 global unique 但其實 bucket 位置是有 region 的... 目前還沒有看到什麼比較好的方式來發佈 lambda layer 到全部的 region.... replicate 所有的 zipfile 到所有的 region, 然後每個都有自己的 bucket name 似乎蠻蠢的?....