貢獻PHP套件開源專案學到的技巧
Outline
-
自我介紹
-
什麼是開源專案?可以吃嗎?
-
開源貢獻包含了哪一些?
-
我怎麼入坑的?
-
學習到的 Modern PHP 技巧
-
多人開發心得 & 有趣的事情
-
介紹國外的開源貢獻活動
自我介紹
-
Peter
-
目前在ITRI服務
-
後端開發者
-
3+ years PHP 後端程式開發
-
PHP 5.3 → PHP 7+
-
No framework→Slim→Laravel
-
2 years 開源專案貢獻者
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034107/9021747.jpg)
什麼是開源專案?
以開源專案許可下公開的專案
-
MIT License
-
GPL/GNU
-
Apache Licenese
-
etc.
什麼是開源專案貢獻?
開源貢獻活動
-
Issue submission
-
Send pull request
-
etc.
Issue submission
Report bugs
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034132/pasted-from-clipboard.png)
Feature requests
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034118/pasted-from-clipboard.png)
Official docs
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034114/pasted-from-clipboard.png)
Send pull request
-
在發送issue之後
-
也可以直接發送 PR
開源貢獻流程
-
發送 issue → 發送 PR
-
直接發送 PR
開源貢獻好處
-
學習技巧
-
線上多人合作
-
看code能力提升,再爛code都可以看
- 幫助別人,也幫助自己
-
不用加入公司,也可以對他們開源專案做貢獻
我是怎麼入坑的?
事情是這樣的...
當時的社群機器人很夯
我想做個問天氣機器人
我找到了bug...並發送PR
Bug
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5029107/pasted-from-clipboard.png)
第一次就不會發送PR
還開了很多個PR...
還被指教了一番
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5025236/pasted-from-clipboard.png)
最後還是被merged了
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5025262/pasted-from-clipboard.png)
第一次 PR 我學會了...
-
Squash all commits to one commit
-
Explain for the changes
-
Accept request changes
等一等...
那個問天氣機器人呢?
去開源貢獻了!
不要問我問天氣機器人在哪!
因為我也不知道XD
我學到的Modern PHP技巧
從四個種類角度切入
Enhancement
Features
Fix bugs
Write docs
Enhancement
-
Test enhancement
-
Test enhancement 2 Organize src
- Add more tests
Test enhancement
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034210/pasted-from-clipboard.png)
Test enhancement tips
$this->assertSame(true, $resultTrue);
$this->assertSame(false, $resultFalse);
$this->assertSame(\InvalidgrumentException::class,
$resultInstance);
$this->assertSame(23, count($resultArray));
$this->assertInstanceOf('\\Psecio\\SecureDotenv\\KeySource\\KeyString',
$k);
Test enhancement tips
$this->assertTrue($resultTrue);
$this->assertFalse($resultFalse);
$this->assertInstanceOf(\InvalidgrumentException::class,
$resultInstance);
$this->assertCount(23, $resultArray);
$this->assertInstanceOf(KeyString::class, $k);
Test enhancement tips
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034728/pasted-from-clipboard.png)
Test enhancement tips
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034731/pasted-from-clipboard.png)
Organize src
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034242/pasted-from-clipboard.png)
Organize src
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034248/pasted-from-clipboard.png)
Organize src
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034249/pasted-from-clipboard.png)
Add more tests
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034278/pasted-from-clipboard.png)
Add more tests
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034281/pasted-from-clipboard.png)
Add more tests
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034253/pasted-from-clipboard.png)
Features
Add isPrimeNumber method
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034268/pasted-from-clipboard.png)
Add isPrimeNumber method
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034324/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034331/pasted-from-clipboard.png)
Initialize tests
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034366/pasted-from-clipboard.png)
Initialize tests
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034379/pasted-from-clipboard.png)
Fix bugs
- oscarotero/imagecow
- jwage/easy-csv
- jwage/purl PR#60
- jwage/purl PR#62
oscarotero/imagecow
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034436/pasted-from-clipboard.png)
oscarotero/imagecow
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034479/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034482/pasted-from-clipboard.png)
oscarotero/imagecow
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034441/pasted-from-clipboard.png)
oscarotero/imagecow
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034444/pasted-from-clipboard.png)
oscarotero/imagecow
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034445/pasted-from-clipboard.png)
jwage/easy-csv
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034450/pasted-from-clipboard.png)
jwage/easy-csv
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034464/pasted-from-clipboard.png)
jwage/easy-csv
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034458/pasted-from-clipboard.png)
jwage/easy-csv
return
(isset($this->headers) && is_array($this->headers))
&& (count($this->headers) !== count($row))
? $this->getRow() : array_combine($this->headers, $row);
jwage/purl PR#60
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034493/pasted-from-clipboard.png)
jwage/purl PR#60
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034509/pasted-from-clipboard.png)
jwage/purl PR#60
URI = scheme:[//authority]path[?query][#fragment]
jwage/purl PR#60
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034501/pasted-from-clipboard.png)
jwage/purl PR#62
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034517/pasted-from-clipboard.png)
jwage/purl PR#62
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034520/pasted-from-clipboard.png)
Write docs
odan/image
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034557/pasted-from-clipboard.png)
odan/image
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034561/pasted-from-clipboard.png)
odan/image
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034569/pasted-from-clipboard.png)
odan/image
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034574/pasted-from-clipboard.png)
odan/image
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034575/pasted-from-clipboard.png)
danielgsims/php-collections
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034577/pasted-from-clipboard.png)
danielgsims/php-collections
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034579/pasted-from-clipboard.png)
danielgsims/php-collections
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034584/pasted-from-clipboard.png)
Review PR
m1/Env
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034526/pasted-from-clipboard.png)
m1/Env
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034530/pasted-from-clipboard.png)
m1/Env
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034531/pasted-from-clipboard.png)
appzcoder/30-seconds-of-php-code
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034711/pasted-from-clipboard.png)
nahid/jsonq
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5080350/pasted-from-clipboard.png)
nahid/jsonq
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5080355/pasted-from-clipboard.png)
難→易
-
Enhancement
-
Features
-
Fix bugs
-
Write docs
貢獻前需要知道的事
貢獻步驟
-
Create issue (option)
-
Fork it
- Read the CONTRIBUTING.md
-
Create and checkout a branch
-
Add the code
-
Send PR
CONTRIBUTING.md
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034709/pasted-from-clipboard.png)
Coding style
.php_cs
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034630/pasted-from-clipboard.png)
PHP_CodeSniffer
curl -OL \
https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar
php phpcs.phar --standard=PSR2 src/ tests/ --colors
Static analyzer
phpstan
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034696/pasted-from-clipboard.png)
psalm.xml
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034699/pasted-from-clipboard.png)
psalm.xml
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034703/pasted-from-clipboard.png)
Continuous Intergration
CI
Travis CI/.travis.yml
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034649/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034656/pasted-from-clipboard.png)
StyleCI/.styleci.yml
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034641/pasted-from-clipboard.png)
介紹國外的開源貢獻活動
Hacktoberfest
Hacktoberfest
24pullrequests
Summary
- 沒有最好,只有比較好
- Accept request changes
- 開源貢獻是多人合作的經驗
Summary
-
被人幫助,幫助別人
-
別人的感謝是繼續貢獻動力
-
讓開源專案更好
-
做國民外交
別人的感謝是繼續貢獻動力
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034683/pasted-from-clipboard.png)
別人的感謝是繼續貢獻動力
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5034691/pasted-from-clipboard.png)
Any questions?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/404993/images/5031642/圖片1.png)
貢獻PHP套件開源專案學到的技巧
By peter279k
貢獻PHP套件開源專案學到的技巧
- 2,329