(Acest articol a fost publicat pentru prima dată pe Blogul lui Yohannși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)
Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.
Formatarea consistentă a codului este un aspect crucial al dezvoltării colaborative care este adesea trecut cu vederea. Codul bine formatat oferă mai multe avantaje semnificative:
- Lizibilitate: Formatarea uniformă face codul mai ușor de citit și de înțeles pentru toată lumea
- Mentenabilitate: Stilul consistent reduce încărcarea cognitivă atunci când navigați prin cod
- Colaborare: Formatarea standardizată reduce conflictele de îmbinare și face ca recenziile codului să fie mai eficiente
Formatter Air pentru R aduce aceste beneficii la Codebase R cu un efort minim de configurare, ajutând echipele să stabilească și să mențină automat un stil de codificare consistent. În timp ce acest ghid se concentrează în mod specific pe aer, principiile și beneficiile se aplică oricărui format de cod – cel mai important factor este ca toți membrii echipei să folosească același instrument de formatare cu setări consistente.
- Air instalat
- În funcție de IDE -ul dvs., poate fi necesar să instalați unele extensii (ca utilizator VSCOD
- Pentru a testa dacă formatul funcționează, puteți utiliza următoarea comandă:
air format .
într -un terminal (nu consola R)!
Vă rugăm să citiți următoarele resurse înainte de a începe:
- https://posit-dev.github.io/air/formatter.html
- https://www.tidyverse.org/blog/2025/02/air/
Avertizare pentru utilizatorii VSCODE
Înainte de a folosi Air, foloseam formatul Reditorsupport prevăzut cu extensia R pentru VSCODE. Aerul nu funcționa, pentru că am uitat să -l editez corect settings.json
fişier.
Dacă doriți ca aerul să fie utilizat ca formatter implicit, vă rugăm să comentați sau să eliminați linia "editor.defaultFormatter": "REditorSupport.r"
În tine settings.json
fişier.
"(r)": { // "editor.defaultFormatter": "REditorSupport.r", "editor.formatOnSave": true } "(rmd)": { // "editor.defaultFormatter": "REditorSupport.r", "editor.formatOnSave": true } "(quarto)": { // "editor.defaultFormatter": "REditorSupport.r", "editor.formatOnSave": true }
Așa cum este stabilit în settings.json
Fișier, AIR este utilizat ca formator implicit, așa cum se va aplica la salvarea oricărui fișier R. Există și alte modalități de a utiliza Air, Pre-Commit sau GitHub Action Workflow.
Un cârlig pre-angajament este o operațiune care se efectuează înainte de a se face un angajament. Dacă sunteți un dezvoltator de pachete R, uneori ați fost deja să vă ocupați de un mesaj care să spună că atât fișierele legate de readme: README.md
şi README.Rmd
Trebuie să fie organizate împreună într -un angajament specific.
Acest cârlig înainte de angajament este adăugat automat la proiectul dvs. atunci când utilizați usethis::use_readme_rmd()
!
Cum se adaugă un cârlig pre-angajament
usethis::use_git_hook( "pre-commit", "air format ." )
Această comandă implică faptul că pentru fiecare angajament pe care îl veți face, întreaga bază de cod a proiectului dvs. va fi reformată.
Cârligele pre-comitere sunt amplasate într-un folder ascuns al depozitului dvs. Dacă doriți să aruncați o privire asupra fișierului generat/modificat, trebuie să căutați următorul fișier (pornind de la rădăcina proiectului dvs.): .git/hooks/pre-commit
Proscuțiile de cârlige pre-angajament sunt:
- Se asigură că tot codul este formatat înainte de a fi angajat în depozit
- Împiedică introducerea codului neformatat
- Aplică stilul de cod constant în cadrul proiectului
Contra de cârlige pre-angajament sunt:
- Sunt locale pentru mașina fiecărui dezvoltator și trebuie să fie configurate individual
- Poate fi ocolit cu
git commit --no-verify
Dacă un dezvoltator alege - Poate încetini procesul de comitere pentru bazele mari de coduri
- Necesită instalarea aerului pe mașina fiecărui dezvoltator
- Dacă se schimbă regulile de formatare, toți dezvoltatorii trebuie să își actualizeze configurația locală
Dacă utilizați deja opțiunea "editor.formatOnSave": true
cârligul pre-angajament ar putea fi inutil (cu excepția pentru prima dată când îl veți folosi, prin formatarea întregului codbase) și s-ar putea să fiți mai interesat să utilizați fluxul de lucru al acțiunilor Github!
În main
sucursala unui proiect pe care vreau să am doar cod „rezistent la gloanțe”, adică un cod în care devtools::check()
Nu returnează nicio eroare, nici un avertisment, nici o notă. De fiecare dată când deschid o cerere de tragere de la o sucursală către filiala principală, conduc o acțiune Github care apelează devtools::check()
. Permite contopirea codului propus numai dacă această acțiune Github trece.
Pentru a mă asigura că codul fuzionat are și formatul așteptat, am completat fișierul meu de configurare GitHub Action YAML pentru a apela la formatul AIR pe codul meu, numai dacă devtools::check()
a avut succes.
Acest lucru este foarte convenabil atunci când lucrați cu alți colegi din același proiect, cu IDE potențial diferit, pentru a vă asigura că formatul de cod este același între toată lumea și, prin urmare, pentru a evita contopirea conflictelor din cauza formatării.
Spre deosebire de cârligele pre-angajament care sunt „specifice computerului”, fluxul de lucru al acțiunilor Github va fi rulat de la distanță, asigurându-se că orice modificare a setărilor de format a codului va fi aplicată oricărui cod trimis la baza principală de cod!
Pentru a utiliza acest flux de lucru cu acțiuni Github, vă rugăm să creați următorul folder: .github/workflow/
și adăugați următoarele într -un .yaml
fişier.
# Workflow derived from https://github.com/posit-dev/setup-air/tree/main/examples on: pull_request: branches: (main, master) name: check_and_formatting.yml permissions: contents: write jobs: R-CMD-check: runs-on: ${{ matrix.config.os }} name: ${{ matrix.config.os }} (${{ matrix.config.r }}) strategy: fail-fast: false matrix: config: - { os: ubuntu-latest, r: "release" } env: GITHUB_PAT: ${{ secrets.GH_TOKEN }} R_KEEP_PKG_SOURCE: yes steps: - uses: actions/checkout@v4 - uses: r-lib/actions/setup-pandoc@v2 - uses: quarto-dev/quarto-actions/setup@v2 - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} http-user-agent: ${{ matrix.config.http-user-agent }} use-public-rspm: true - uses: r-lib/actions/setup-r-dependencies@v2 with: extra-packages: any::rcmdcheck needs: check - uses: r-lib/actions/check-r-package@v2 with: upload-snapshots: true build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' format-check: name: format-check needs: R-CMD-check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install uses: posit-dev/setup-air@v1 - name: Check run: air format . - name: Commit changes run: | git config --global user.name "github-actions(bot)" git config --global user.email "github-actions(bot)@users.noreply.github.com" git add . git diff --cached --quiet || git commit -m "style: auto-format code via air format" - name: Push changes if: github.event_name == 'pull_request' && github.head_ref != '' run: | git pull --rebase origin ${{ github.head_ref }} git push origin HEAD:${{ github.head_ref }}
Prin încorporarea aerului în fluxul de lucru:
- Eliminați discuțiile în stil consumatoare de timp și formatarea manuală
- Codebase -ul dvs. menține un stil consistent, indiferent de cine contribuie
- Recenziile de cod se pot concentra mai degrabă pe substanță decât pe stil
- Noii membri ai echipei se pot adapta rapid la convențiile proiectului dvs.
Nu ezitați să -mi puneți nicio întrebare despre acest flux de lucru sau vreo idee de îmbunătățire!