è¿å¹´ã®ã½ããã¦ã§ã¢éçºã§ã¯ãRenovateãDependabotã¨ãã£ãä¾åé¢ä¿æ´æ°ã®ããã®ãã¼ã«ãæ®åãã¦ãã¦ããã¼ã«ã®æ¯æ´ãåããªããä¾åã©ã¤ãã©ãªãæ´æ°ãã¦ããéçºããã¼ãåºã¾ã£ã¦ãã¦ããã
ãããã®ãã¼ã«ã¯ãpackage.jsonã§ç®¡çããã¦ããã©ã¤ãã©ãªã ã£ãããDockerfileã§æå®ãã¦ããã¤ã¡ã¼ã¸ã ã£ãããèªåçã«ææ°çã«æ´æ°ãã¦Pull Requestãåºãã¦ãããã®ã§ã人éã¯å
容ã確èªãã¦ãã¼ã¸ãã¿ã³ãæ¼ãããå¤ãªã¨ããããã£ããæç´ããã¦ãããã¼ã¸ãã¦ããã ãã§ããã
ã¯ã¦ãªã§ã®éçºããã¼ã§ã使ãåãã¦ãã¦ãå
æãããã«ãã社å
ã§å
±æãã¦ä½¿ã£ã¦ãè¨å®ãå
¬éããããã¦ãããä»ã§ã¯Renovateã®ãªãæ®ããã«æ»ããã¨ã¯èããããªããããã«åºã¾ã£ã¦ããã
developer.hatenastaff.com
æ®æ®µãä»äºã§ã¯PerlãTypeScriptãæ¸ãã¦ãã¦ãTypeScriptå´ã¯Renovateã®æ´»èºã§ã©ãã©ããã¼ã¸ã§ã³ãä¸ãã¦ãããã
ããããPerlã«ã¯Renovateçãªã©ã¤ãã©ãªã®ä¾åé¢ä¿ãä¸ãã¾ãã£ã¦ãããã°ããºããªãã®ã§ã人éãé å¼µã£ã¦ä¸ãã¦ãããããªããä¾åã©ã¤ãã©ãªãå¤ã³ã¦ãããã¡ã ã£ãã
Perlã§ãä¾åé¢ä¿ãä¸ãã¦ãããã°ããºãã»ãããã¨æãç«ã£ã¦é£ä¼ä¸ã«ä½ãå§ãã¦ãCIããPull Requestãéã£ã¦ãããã¨ããã¾ã§ã§ããããã«ãªã£ãã
App::UpdateCPANfileã¨ããã®ãä½ã£ã
cpanfileãæ´æ°ãããApp::UpdateCPANfileã¨ããã©ã¤ãã©ãªãä½ã£ããCPANã«ä¸ãã£ã¦ãã¦ããããã¦update-cpanfileã¨ããCLIã³ãã³ããã»ããã§ã¤ã³ã¹ãã¼ã«ãããã
% cpanm App::UpdateCPANfile % update-cpanfile pin
Renovateã«ãªãã£ã¦ãPin Dependenciesãã¦ãUpdate Dependenciesãã¦ãããã¨ããã2ã¹ããããè¸ãã§æ´æ°ãã¦ãããããããã®å·¥ç¨ã®å½¹å²ã¯ä»¥ä¸ã®éãã
- Pin Dependencies
- ä¾åã©ã¤ãã©ãªã®ãã¼ã¸ã§ã³æå®ãrangeã使ã£ãæå®ã§ã¯ãªãããã³ãã³ãã§åºå®ããå·¥ç¨
- Update Dependencies
- ä¾åã©ã¤ãã©ãªã®ãã¼ã¸ã§ã³æå®ãå®éã«ææ°çã«æ´æ°ããå·¥ç¨
ä¾åã©ã¤ãã©ãªãåºå®ãã
Node.JSã«ã¤ãã¦èããã¨ãpackage.jsonã«ã¯ãã®ãã¼ã¸ã§ã³ã®ç¯å²å
ã®ã©ã¤ãã©ãªããã ãããã¨ãã¼ã¸ã§ã³ã®ã¬ã³ã¸ã ããæ¸ãã¦ãnpm installããã¨ãpackage-lock.jsonã«ãå®éã«ã¤ã³ã¹ãã¼ã«ããããã¼ã¸ã§ã³ãè¨é²ãããã
ããã§ã¯ãªãã¦ãpackage.jsonã®æç¹ã§ããã®ã©ã¤ãã©ãªã¯ãã®ãã¼ã¸ã§ã³ãã¨åºå®ãã¦æ¸ãã¦ãã¾ãã®ããdependency pinningã¨ããæä½ã
pinãããã©ããã¯Renovateã®ããã¥ã¡ã³ãã«ã¯è©³ç´°ãªè°è«ãè¼ã£ã¦ããã®ã§åç
§ãã¦ãã ããã
Node.JSã§ã¯è¤æ°ãã¼ã¸ã§ã³ãåæã«ã¤ã³ã¹ãã¼ã«ããããã¨ãããã®ã§åã©ã¤ãã©ãªã好ãã«åºå®ãã¦ããããã©ãPerlã§ã¯åæã«2ãã¼ã¸ã§ã³ãã¤ã³ã¹ãã¼ã«ãã¦åãããã¨ã¯ã§ããªãç¹ã¯è¦æ³¨æã
å®è¡ç°å¢ãå¶å¾¡ç¯å²å
ã«ãããèªåãã¡ã§ãããã¤ãããããªã¢ããªã±ã¼ã·ã§ã³ãä½ã£ã¦ãããªãåºå®ãã¦ãã¾ã£ã¦ããã¡ãªããã¯ç¡ãã¦ãCPANã§é
ã£ã¦ä½¿ã£ã¦ããããããªããã°ã©ã ãã©ã¤ãã©ãªãä½ã£ã¦ãããªããå
±ã«ã¤ã³ã¹ãã¼ã«ãããä»ã®ã©ã¤ãã©ãªã®ãã¨ãèãã¦pinããã«rangeã§æå®ããã®ãããããã
Perlã§ä¾åã©ã¤ãã©ãªãåºå®ããã«ã¯ãcpanfile.snapshotã«è¨é²ããã¦ãããã¼ã¸ã§ã³ãcpanfileã«æ¸ãæ»ãã°ãããcpanfileã¯Module::CPANfileãcpanfile.snapshotã¯Carton::Snapshotã使ã£ã¦ãã¼ã¹ããã
ãã®ã¨ãã«æ³¨æãã¹ããªã®ã¯ã1.0 ã§ã¯ >= 1.0ã®æå³ã«ãªã£ã¦ãã¾ãã== 1.0 ã¨è¨å®ããå¿
è¦ãããç¹ã
Note that, per CPAN::Meta::Spec, when a plain version number is given, it means the version or newer is required. If you want a specific version for a module, use the specific range syntax, i.e. == 2.1 .
https://metacpan.org/pod/distribution/Module-CPANfile/lib/cpanfile.pod
ä»åä½ã£ããupdate-cpanfileã³ãã³ãã«ãµãã³ãã³ãã¨ãã¦pinã渡ãã¨ãcpanfileãä¸æ¸ããã¦ãããã
% update-cpanfile pin % git status Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: cpanfile
cpanfileã確èªããã¨ããããã調åã§åã¢ã¸ã¥ã¼ã«ã®ãã¼ã¸ã§ã³ãåºå®ããã¦ãããã¨ããããã
% git diff | cat diff --git a/cpanfile b/cpanfile index 41f0722..2686e73 100644 --- a/cpanfile +++ b/cpanfile @@ -1,23 +1,23 @@ requires 'perl', '5.008001'; -requires 'Module::CPANfile'; -requires 'Module::CPANfile::Writer'; -requires 'CPAN::PackageDetails'; -requires 'CPAN::DistnameInfo'; -requires 'LWP::UserAgent'; -requires 'IO::String'; +requires 'Module::CPANfile', '== 1.1004'; +requires 'Module::CPANfile::Writer', '== 0.01'; +requires 'CPAN::PackageDetails', '== 0.261'; +requires 'CPAN::DistnameInfo', '== 0.12'; +requires 'LWP::UserAgent', '== 6.46'; +requires 'IO::String', '== 1.08'; requires 'Getopt::Long'; -requires 'Carton'; +requires 'Carton', '== 1.000034'; requires 'CPAN::Meta::Prereqs', '>= 2.150010';
pinããæ¡ä»¶ã¨ãã¦ã¯ãcpanfileã«è¼ã£ã¦ãããã®ã対象ã«ãã¦ãã¦ãcpanfileã«è¼ã£ã¦ããã©ã¤ãã©ãªã®ããã«ä¾åãã¾ã§ã¯è¦ã¦ããªãã
é¤å¤ããæ¡ä»¶ããã£ã¦ãã¤ã³ã¹ãã¼ã«æ¸ã®ã©ã¤ãã©ãªãã³ã¢ã¢ã¸ã¥ã¼ã«ã§ãã£ã¦ããã¤perlã«å梱ããã¦ãããã¼ã¸ã§ã³ããã®ã¾ã¾ä½¿ããã¦ããã¨ããã¯é¤ãããã«ãã¦ã¿ã¦ããããã¨ãã°ãFile::Basenameã«ã¤ãã¦èããã¨ãFile::Basenameã¯perlã«å梱ããã¦ããã®ã§ããã¼ã¸ã§ã³ãåºå®ãã¦ãã¾ãã¨ä»ã®ãã¼ã¸ã§ã³ã®perlã§åããªããªãæããããããã
ä¸æ¹ã§ãperlã«å梱ããã¦ãããã¼ã¸ã§ã³ããã®ã¾ã¾ä½¿ããã¦ããã¨ãã¯pinããã»ããããã¦ãEncodeã¯ã³ã¢ã¢ã¸ã¥ã¼ã«ã ãã©ãææ°çãCPANããã¤ã³ã¹ãã¼ã«ãã¦ããã¨ãã«ã¯ã対象ãã¼ã¸ã§ã³ãpinããããã«ãã¦ããã
ããããè¤éãªãã¨ããã£ã¦ãããã©ããã®ãããã¯ã©ããªæ¯ãèãã«ãªãã®ãä¸çªä½¿ãããããã¯ããããã£ã¦ããªãã®ã§ãæ§åãè¦ã¦èª¿æ´ãã¦ããããã
ä¾åã©ã¤ãã©ãªãæ´æ°ãã
cpanfileã«è¨è¼ããã¢ã¸ã¥ã¼ã«ã®ãã¼ã¸ã§ã³æå®ãææ°çã®ãã¼ã¸ã§ã³ã«æ¸ãæãããã¨ãããã°ãä¾åããã©ã¤ãã©ãªãææ°ãã¼ã¸ã§ã³ã«æ´æ°ãããã¨ãã§ããã
update-cpanfile updateã¨ãã¦æ´æ°ã³ãã³ããå¼ã¶ã¨æ´æ°ã試ã¿ã¦ãcpanfileãä¸æ¸ããã¦ãããã
å
é¨çã«ã¯CPANãã02packages.details.txt.gzãåå¾ãã¦ãCPAN::PackageDetailsã使ã£ã¦ææ°ã®ãã¼ã¸ã§ã³ä¸è¦§ãåå¾ããcpanfileã§ã®ãã¼ã¸ã§ã³æå®ã¨è¦æ¯ã¹ã¦ãä¸æ¸ããã¦ããå¦çãå®è£
ããããã®ãããã®ãã¼ã¿æ§é ã¯ãã¼ãµã¼ãæã£ã¦ãã¦å©ãã£ãã
以ä¸ã¯Module::CPANfileãããã¨å¤ããã¦ããupdateãã¦ã¿ãã¨ãã®æ§åãå¤ãããæ¾ç½®ãã¦ããcpanfileã«å¯¾ãã¦å®è¡ããã¨ãããè¿«åã®ããdiffãåºãã
% update-cpanfile udpate % git diff | cat diff --git a/cpanfile b/cpanfile index 253ab2f..1577d67 100644 --- a/cpanfile +++ b/cpanfile @@ -1,6 +1,6 @@ requires 'perl', '5.008001'; -requires 'Module::CPANfile', '== 1.1003'; +requires 'Module::CPANfile', '== 1.1004'; requires 'Module::CPANfile::Writer', '== 0.01'; requires 'CPAN::PackageDetails', '== 0.261'; requires 'CPAN::DistnameInfo', '== 0.12';
pinã®ã¨ãã«ã触ãããã©ãããããªã©ã¤ãã©ãªãã¡ã好ãåæã«pinã»updateãã¦ããã¨ããã®ã©ã¤ãã©ãªã¨ãã®ã©ã¤ãã©ãªã¯è¦æ±ããã©ã¤ãã©ãªãç°ãªã£ã¦ããã®ã§ãåæã«ã¤ã³ã¹ãã¼ã«ã§ããªãã¨ããäºæ
ãçºçããã¨æããããã©ã¤ãã©ãªã§ç´°ããç¸ã£ã¦ãã¾ãã¨åãåããæªãã ãã®ã©ã¤ãã©ãªã«ãªã£ã¦ãã¾ãæããããã®ã§ãèªåã§ãããã¤ãã¦åããã¢ããªã±ã¼ã·ã§ã³ã®ã¿updateã®å¯¾è±¡ã«ããã®ãããã®ããªã¨èãã¦ããã
CIããæ´æ°ããã
Renovateã¯Pull Requestã®ä½ãæ°ãå¶å¾¡ããã¦ãããããissueã«æ´æ°ãã¹ãã©ã¤ãã©ãªã並ãã§ãã¦ããã§ãã¯ãã¤ããã¨æ´æ°ãèµ°ã£ããã¨ãéçºä½é¨ãããã¸ãè¯ãã
ããã¾ã§ä½ãè¾¼ãæ°ã¯ãªãã£ããã¨ããã®ã¨ãæ®æ®µã®éçºã§ã¯GitHub Actionsã使ã£ã¦Pull Requestãåºããããã¦ããã®ã§ãåæ§ã«ããã¡ã¤ã«ã®æ¸ãæããããã¨ã®å·¥ç¨ã¯Pull Requestãä½ã£ã¦ãããActionã«ä»»ãããã¨ã«ãããpeter-evans/create-pull-requestã使ãã¨ç°¡åã
GitHub Actionsããcpanfileãæ´æ°ãããµã³ãã«ã®YAMLãç¨æãã¦ãã¦ã以ä¸ã¯æ¯æ9æ(JST)ã«cpanfileãæ´æ°ãã¦Pull Requestãã¤ããWorkflowããããã³ãã¼ãã¦ã使ãã®ããã¸ã§ã¯ãã«è¿½å ããã¨Pull Requestã製é ãã¦ããããã¯ããã³ã¢ã¢ã¸ã¥ã¼ã«ã®ãã¼ã¸ã§ã³ããã®ã¾ã¾ä½¿ããã¦ãããã®å¤å®ãªã©ã¯å®è¡ä¸ã®perlã®ãã¼ã¸ã§ã³ã«ãã£ã¦ææç©ã®çµæãå¤ããã®ã§ãå®è¡ã«ä½¿ãperlã®ãã¼ã¸ã§ã³ã¨ã説ææã¨ãã¯é©å®èª¿æ´ãã¦ããå©ç¨ããå¿ è¦ãããã
App::UpdateCPANfileèªä½ã®æ´æ°ã®Pull Requestã¯ãã®ãããªå½¢ã§ä½ãã¦ãããããããã¼ã¸ãã¦ãã¾ãã¨æ´æ°ã®ãã¹ããã§ããªããªãã®ã§ãã¼ã¸ããã«ç½®ãã¨ãããä»åº¦ã¯ã³ã³ããªã¯ããã¦ãã¾ã£ããæ¯æ¥åãã®ã§ãã»ã£ã¨ãã¦ãææ¥æ9æã«ä½ãç´ãã¦ããããã¯ãã
Update cpanfile by hitode909 · Pull Request #7 · hitode909/App-UpdateCPANfile · GitHub
ã¾ãããã§ã«å¤ã³ã¦ãããããã¯ãã§ä¸æ°ã«ã©ã¤ãã©ãªãæ´æ°ãã¦ãã¬ãã¥ã¼ãåä½ç¢ºèªãé£ãããªããã¨ããåé¡ãããã大éã®ã¢ã¸ã¥ã¼ã«ãä¸æ°ã«å¤æ´ãã¦åé¡ãåºãã¨ããã©ããã¾ããã£ããåãåããã®ã«è¦å´ãããã¨ã«ãªãã§ãããã
ããã°ãã³ãªãªã¼ã¹ãé¿ãã¦ã¡ãã£ã¨ãã¤ã¢ãããã¼ããã¦ããããã«ã--limit 1ã§æåã®1件ã ãæ´æ°ãããªãã·ã§ã³ãç¨æãã¦ãããããã使ãã¨ã¢ã¸ã¥ã¼ã«ãã¢ã«ãã¡ãããé ã«è¦ã¦ãã£ã¦æåã®1件ã ããä¿åã§ãããä»äºã§è§¦ã£ã¦ãããããã¯ãã§ã¯limit 1ã§Pull Requestãä½ãããã«ããããä»æ¥ã¯AWS::XRayã®æ´æ°ã®Pull Requestããã¦ãããAããZã¾ã§é ã«é²ãã§ããã®ã§å
ã¯é·ãã
% update-cpanfile update --limit 1
ç¹å®ã®ã©ã¤ãã©ãªã ãæ´æ°ããã
ãã®ã©ã¤ãã©ãªãã¨ã«ããææ°ã«ä¸ããããã¨ããã¨ãã«ã¯--filterãªãã·ã§ã³ã§å¯¾è±¡ã®ã©ã¤ãã©ãªãçµãè¾¼ãããæã§ææ°ãã¼ã¸ã§ã³ãæ¢ãã¦ãã¦cpanfileãæ¸ãæããããã¯ãæ¥ã ã®ãªãã¬ã¼ã·ã§ã³ãã¡ãã£ã¨ã¯æ¥½ã«ãªãã¯ãã
% update-cpanfile update --filter JSON::XS --- a/cpanfile +++ b/cpanfile -requires 'JSON::XS', '== 3.02'; +requires 'JSON::XS', '== 4.02';
ã¨ããã§cpanfile.snapshotã®æ´æ°ã¯ã©ããã¾ãã
社ã®ãããã¯ãã§ã¯ãcpanfile.snapshotãCIããæ´æ°ãã¦ãã¦ãcpanfileãpushããã¨ãbotãCIä¸ã§carton installãã¦cpanfile.snapshotãç¶ãã¦ã³ããããã¦ãããä»çµã¿ãç¨æãã¦ããã
æ°ããã©ã¤ãã©ãªã¨ããªãã®ã¢ããªã±ã¼ã·ã§ã³ãçµåããç°å¢ã§ãã¹ããéã£ã¦ãã¾ãããã¨ããã¨ããã¾ã§èªåã§ãããªãããã¨ãã¬ãã¥ã¼ããã¼ã¸ããæéãä¸ããã
æ¡ããªãã£ãã¢ããã¼ã
Renovateãç´æ¥Perlããµãã¼ãã§ããã°Renovateãæä¾ããã¹ã±ã¸ã¥ã¼ãªã³ã°ã®ä»çµã¿ã«ä¹ã£ããã¦æ¥½ãªã®ã ãããã©ãcpanfileã¯Perlã®DSLã§ãããpackage.jsonã®ãããªJSONãã¡ã¤ã«ãªã©ã¨æ¯ã¹ã¦ãã¼ã¹ãé£ããã
cpanfileã¨ãããã¼ã¹ãããã¨ã®ãªãæªç¥ã®ãã¼ã¿å½¢å¼ãåã§ãã¼ã¹ããæ§é ã«å¯¾ãã¦ããã¼ã¸ã§ã³æ´æ°ã¨ããæªç¥ã®å¦çãå®è£
ãã¦ãã¾ãã¨ã対象ã®ãã¼ã¿æ§é ã®æ±ããå¤ãªã®ãããã®å¾ã®ãã¸ãã¯ã®åãåããé£ãããªã£ã¦ãã¾ãã®ã§ãã¾ãã¯çå®ã«åãæ¹æ³ãåããã¨ãæ¢åã®ãã¼ã¹ã©ã¤ãã©ãªãå©ç¨ãã¦ããã¼ã¸ã§ã³æ´æ°å¦çã ããPerlã§å®è£
ãããã¨ã«ããããã®çµæãªãã¨ãªã1æ¥ã§åããã®ã¯ã§ããã®ã§è¯ãé¸æã ã£ãã¨ã¯æãã
ã©ãããå©ç¨ãã ãã
æå
ã®æ°ããã¸ã§ã¯ãã«å¯¾ãã¦åããã¦ã¿ã¦ããªããåãã¦ããã ããã¨ããããããªã®ã§ãã¾ã ã¾ã ãã°ãããã¯ããã¾ããPerlã®ä¾å管çã®ä¸çã¯å¥¥æ·±ãã®ã§ãæ³å®å¤ã®ã±ã¼ã¹ãããã«ã¡ãããªããcpanfileã«conflictsã£ã¦æ¸ãããã¨ã¯ä»æç¥ã£ãã
ä½ã£ã¦çµããã§ã¯ãªãã¦ã社ã®ãããã¯ãã«åãã¦ã¯æ¯æ¥Pull Requestãä½ãããã«ãã¦ã¿ãã®ã§ãæ¥ã
使ã£ã¦ã¿ãªããæ§åãè¦ã¦ãå¤ãªã¨ããã¯é½åº¦ç´ãã¦ãããã¨æã£ã¦ããã
github.com
åè
- GitHub - pokutuna/p5-App-CpanfileSlipstop: write installed module versions back to cpanfile
- id:pokutunaã以åã«PPIã使ã£ã¦cpanfile.snapshotããcpanfileã«æ¸ãæ»ããã¼ã«ãä½ã£ã¦ãããä»åä½ã£ããã¼ã«ã®ãã¡pinã¾ã§ã¯ãã®ãã¼ã«ã§ãããã®ã ãã©ãpinã¨updateã§å¥ã®ã½ããã¦ã§ã¢ãåãã®ãæ°æã¡æªããã¨æã£ã¦pinãå®è£ ãã¦ãã¾ã£ãã
- GitHub - akiym/Module-CPANfile-Writer
- App::CpanfileSlipstopãåãã¦id:akiymãcpanfileã®æ¸ãæãé¨åã ããPPRã使ã£ã¦å®è£ ããã©ã¤ãã©ãªãä½ã£ã¦ããã®ã§æ¸ãæ»ãé¨åã§å©ç¨ããã身è¿ãªäººç©ãã¿ãªcpanfileã¨åãåã£ã¦ãã¦ãããããã
- YAPC::Tokyo 2019で静的解析の話をしてきました #yapcjapan - ぱいぱいにっき
- PPRã«ã¤ãã¦ã¯id:mackee_wãããç´¹ä»ããã¦ãã¦ãã¸ãã¨èãã¦ããããã®çºè¡¨ãããããã£ããã©æéåãã§æå¾ã¾ã§è©±ããã©ãçãããæªã ã«ç¶ããæ°ã«ãªã£ã¦ããâ¦ã
- cpanfileがRubyでパースできることに気づいた俺たちは
- id:onkã¯Rubyã§cpanfileããã¼ã¹ãã¦ãã¦ããããã£ã¦ãã¼ã¹ããæ å ±ããã¨ã«ç¤¾å ã®ãããã¯ããã¨ã®ã©ã¤ãã©ãªææ°åº¦ã©ã³ãã³ã°ãçæããã¦ããã
- cpanfileを最新化したい - hitode909
- å®è£ ä¸ã®ã¡ã¢ãå¼ãã ãã¨ãªãAPIãããã¤ãå¼ã¶ã¨ãã¨ãã¯ä½¿ããããªã©ã¤ãã©ãªãscrapboxã«è²¼ã£ã¦ããã¨ä¾¿å©ã
追è¨ãèå¼±æ§æ¤æ»ã¨åããã¦ä½¿ããã¨ãããã
ããããè¯ããã¼ã«ãä½ã£ããã§ãã£ã¦èªæ
¢ãã¦ããããsecurity issueã®ãã§ãã¯ã«ä½¿ããã®ã§ã¯ã£ã¦åéããæè¦ãããã£ããDependabotã¨ãã¯èå¼±æ§ã®ããã©ã¤ãã©ãªã¸ã®ä¾åã ãPull Requestãéã£ã¦ããããããã
ä½ã£ã¦ãæä¸ã¯ãã¢ããªã±ã¼ã·ã§ã³ã®ã©ã¤ãã©ãªã¯ã©ãã©ãä¸ããããããã©ãã©ã¤ãã©ãªã®ã©ã¤ãã©ãªãä¸ãã¦ããæå³ã¯ããã®ã?ã¨æ°ã«ãªã£ã¦ããã®ã ãã©ãèå¼±æ§ã®ããã©ã¤ãã©ãªã¸ã®ä¾åãåãé¤ãã¦ããããªãæ義ãããããã
CPAN::Auditã使ã£ã¦ãèå¼±æ§ã®ããä¾åã ããåãé¤ãã¦ããããªãã·ã§ã³ãç¨æãã¦ããã¦ãèªä½ã®ã©ã¤ãã©ãªã«èå¼±æ§ãããã¨ãã ãPull Requestãåºããã®ãããªä½¿ãæ¹ã¯ããã ãªãã¨æã£ã¦ããã®ã§ãã¿ã¤ãã³ã°ãè¦ã¦ã¡ãã£ã¨ãã£ã¦ã¿ããã¨æãã