Odvisnosti zgornje kode

Vprašanje: Od katerih projektov in knjižnic je odvisen moj projekt?

Opis

Namen te metrike je razumeti število in vrste odvisnosti, ki temeljijo na kodi in so vdelane v del odprtokodne programske opreme. Ta metrika izrecno izključuje odvisnosti, osredotočene na infrastrukturo, kot so baze podatkov in operacijski sistemi, ki bodo razvite kot ločena metrika. Razširjeno, zavedanje o odvisnostih kode navzgor omogoča projektu, da oceni zdravje in trajnost vsake odvisnosti z uporabo drugih meritev CHAOSS.

Cilji

Meritev odvisnosti kode navzgor je namenjena razumevanju odvisnosti, ki temeljijo na kodi in so potrebne za gradnjo, preskušanje ali zagon dela programske opreme. Meritev odvisnosti kode navzgor lahko pomaga ugotoviti, od katerih projektov, knjižnic ali različic je neposredno ali prehodno odvisen moj projekt.

Izvajanje

Uporaba in razširjanje zdravstvenih meritev lahko povzroči kršitve zasebnosti. Organizacije so lahko izpostavljene tveganjem. Ta tveganja lahko izhajajo iz skladnosti z GDPR v EU, z državno zakonodajo v ZDA ali z drugo zakonodajo. Obstajajo lahko tudi pogodbena tveganja, ki izhajajo iz pogojev storitve za ponudnike podatkov, kot sta GitHub in GitLab. Pri uporabi metrik je treba preveriti tveganje in morebitne težave glede etike podatkov. Prosim poglej Dokument o etiki podatkov CHAOSS za dodatna navodila.

Meritev odvisnosti kode navzgor je mogoče implementirati z analizo datoteke odvisnosti projekta ali z uporabo obstoječih orodij, ki pregledujejo podatke upravitelja paketov za uporabljene jezike (npr. package.json za JavaScript npm, pyproject.toml / requirements.txt za Python, Gemfile / Gemfile .lock za Ruby itd.). Opomba: C/C++ običajno uporablja sistemske upravitelje paketov. Stvari postanejo bolj zapletene z več jeziki, v kolikor bo treba skenirati več datotek z odvisnostmi, specifičnimi za jezik.

parametri

Vse naštete odvisnosti morajo vključevati specifične različice(-e), ki se uporabljajo za vsako odvisnost. Upoštevajte, da nekateri sistemi ne podpirajo ali ne uporabljajo "pripenjanja različic" in zato ne uveljavljajo določene različice.

  • Globina drevesa odvisnosti
    • Neposredna odvisnost - odvisnosti prvega reda, kot je navedeno v izvorni kodi in/ali konfiguraciji upravitelja paketov (npr. requirements.txt, Gemfile itd.)
    • Prehodna odvisnost - posredne odvisnosti, to je odvisnosti, ki presegajo odvisnosti prvega reda, imenovane tudi ugnezdene odvisnosti ali odvisnosti drugega reda. Na primer, projekt A, ki se ocenjuje, je odvisen od projekta B in projekt B je odvisen od projekta C. Za projekt A je projekt C prehodna odvisnost.
    • Krožna odvisnost – odvisnosti, kjer, če jih izsledimo, na koncu vodijo nazaj k sebi. V sistemih, ki omogočajo krožne odvisnosti, predvidevamo, da se dana odvisnost v tem primeru šteje le enkrat.
  • Odvisno stanje
    • Statična odvisnost - odvisnost je prisotna v vseh primerih.
    • Dinamična odvisnost - spremembe odvisnosti pri uporabi in v drugih kontekstih
  • Odvisnost od zunanje storitve, kot je uporaba API-ja
  • Odvisnost izvajanja - odvisnosti, potrebne za izvajanje programske opreme. Upoštevajte, da so določene vrste odvisnosti običajno izključene iz štetja, kot je opisano spodaj. To je lahko eno ali več od naslednjega:
    • Odvisnost od gradnje – Koda zahteva gradnjo dela programske opreme
    • Preskusna odvisnost – koda zahteva testiranje dela programske opreme
    • Odvisnost od izvajalnega časa – Koda zahteva zagon dela programske opreme
  • Podrobnosti o odvisnosti izvajalnega okolja jezika (tj. Pythonovo izvajalno okolje)? (privzeto ne). Te podrobnosti so podane zaradi pomembnosti odvisnosti od izvajalnega časa za zagotavljanje kakovosti v varnostno kritičnih sistemih.
    • Pogosto izvajalno okolje jezika, ki bo uporabljeno, nadzirajo navidezna okolja, npr. venv v Pythonu ; v Rubyju, ki bi ga pogosto uporabljali rbenv or rvm implementirati (in običajno vključeno v »Gemfile« ali »Gemfile.lock« in .ruby-version)
    • PyPi vztrajno povečuje svojo logiko "zavračanja prevajanja nezdružljivih knjižnic/odvisnosti". Začenja se "lomiti gradnje".
    • Na žalost vsi sistemi za pakiranje nimajo konvencije za beleženje informacij o različici vseh prehodnih odvisnosti, tudi znotraj njihovega ekosistema (dolgoročno bi morali).
    • V nekaterih sistemih obstaja veliko možnih časov izvajanja, ki jih je težko razlikovati. (Npr. obstaja veliko izvedb Common Lispa in pogosto bi katera koli od njih delovala.)
  • Število vgrajenih knjižnic jezika (npr. »re« v Pythonu)? (privzeto ne)
    • Običajno so številne vgrajene knjižnice izvršljive odvisnosti. Vendar pa so običajno nameščeni "množično" z izbiro jezikovne izvedbe in so zaradi poenostavitve analize pogosto izključeni iz štetja.
    • Primer: privzeto pip freeze ne vključuje teh vrst knjižnic/odvisnosti, »vključenih v jezik«.
  • Več različic iste odvisnosti se šteje neodvisno. Nekateri sistemi podpirajo več različic iste odvisnosti znotraj sistema; v takšnih primerih se štejejo ločeno.

Opomba: Pogosto je pomembno, da med izvajanjem zagotovite informacije o jezikovni izvedbi glavne in manjše različice izdaje.

  • Nekatera štetja in analize potrebujejo te informacije. Jezikovni izvajalniki in vgrajene knjižnice so pogosto izpuščeni (glejte zgoraj), te informacije pa služijo kot okrajšava za zagotavljanje teh dodatnih informacij.
  • Primer: ekosistem Ruby podpira specifikacijo jezikovne različice izvajalnega okolja v Gemfiles in datoteko .ruby-version.
  • Primer: izdaje Pythona iz PyPi in Anaconda pogosto kurirajo različne različice knjižnic na različne načine.

Filtri

  • Trendi skozi čas (npr. ali sem odvisen od več ali manj projektov kot lani)
  • Število različic za vsako odvisnost
  • Število sklicev na isto odvisnost

Vizualizacije

Neposredne odvisnosti

Prehodne odvisnosti

Krožne odvisnosti

Orodja za zagotavljanje metrike

Strategije zbiranja podatkov (neobvezno)

Avtorji

  • Georg Link
  • Matt Germonprez
  • Sean Goggins
  • Sophia Vargas
  • Kate stewart
  • Vinod Ahuja
  • David A. Wheeler
  • Arfon Smith
  • Elizabeth Barron
  • Ritik Malik
  • Dhruv Sachdev
  • Daune O'Brien
  • Michael Scoveta