Ylävirran koodiriippuvuudet

Kysymys: Mistä projekteista ja kirjastoista projektini riippuu?

Kuvaus

Tämän mittarin tavoitteena on ymmärtää avoimen lähdekoodin ohjelmistoon upotettujen koodipohjaisten riippuvuuksien määrä ja tyypit. Tämä mittari sulkee pois infrastruktuurikeskeiset riippuvuudet, kuten tietokannat ja käyttöjärjestelmät, jotka kehitetään erillisenä mittarina. Laajemmin tietoisuus Upstream Code Dependenciesista mahdollistaa hankkeen arvioida kunkin riippuvuuden terveyttä ja kestävyyttä käyttämällä muita CHAOSS-mittareita.

Tavoitteet

Upstream Code Dependency -mittarin tarkoituksena on ymmärtää koodipohjaiset riippuvuudet, joita tarvitaan ohjelmiston rakentamiseen, testaamiseen tai suorittamiseen. Ylävirran koodiriippuvuus -mittari voi auttaa tunnistamaan, mistä projekteista, kirjastoista tai versioista projektini riippuu suoraan tai transitiivisesti.

Täytäntöönpano

Terveysmittareiden käyttö ja levittäminen voi johtaa yksityisyyden loukkauksiin. Organisaatiot voivat altistua riskeille. Nämä riskit voivat johtua GDPR-asetuksen noudattamisesta EU:ssa, Yhdysvaltain osavaltion lain tai muun lainsäädännön noudattamisesta. Tietojen tarjoajien, kuten GitHubin ja GitLabin, palveluehdoista voi myös aiheutua sopimusriskejä. Mittareiden käyttöä on tutkittava riskien ja mahdollisten dataeettisten ongelmien varalta. Ole hyvä ja katso CHAOSS Data Ethics -asiakirja lisäohjeita varten.

Ylävirran koodiriippuvuusmetriikka voidaan toteuttaa analysoimalla projektin riippuvuustiedostoa tai käyttämällä olemassa olevia työkaluja, jotka tutkivat paketinhallintatietoja käytössä oleville kielille (esim. package.json JavaScript npm:lle, pyproject.toml /vaatimukset.txt Pythonille, Gemfile / Gemfile .lock Rubylle jne.). Huomautus: C/C++ käyttää yleensä järjestelmän paketinhallintaohjelmia. Asiat muuttuvat monimutkaisemmiksi useilla kielillä, sillä useita kielikohtaisia ​​riippuvuustiedostoja on tarkistettava.

parametrit

Kaikkien lueteltujen riippuvuuksien tulee sisältää tietyt versiot, joita käytetään kussakin riippuvuudessa. Huomaa, että jotkin järjestelmät eivät tue tai eivät käytä "version kiinnitystä" eivätkä siten pakota tiettyä versiota.

  • Depth of Dependency Tree
    • Suora riippuvuus – ensimmäisen asteen riippuvuudet, jotka on ilmoitettu lähdekoodissa ja/tai paketinhallintakokoonpanossa (esim.vaatimukset.txt, Gemfile jne.)
    • Transitiivinen riippuvuus - epäsuorat riippuvuudet, eli ensimmäisen asteen riippuvuuksien ulkopuoliset riippuvuudet, joita kutsutaan myös sisäkkäisiksi tai toisen asteen riippuvuuksiksi. Esimerkiksi arvioitava projekti A on riippuvainen projektista B ja projekti B on riippuvainen projektista C. Projektissa A projekti C on transitiivinen riippuvuus.
    • Circular Dependency - riippuvuudet, joissa jäljitettynä johtavat lopulta takaisin itseensä. Järjestelmissä, jotka sallivat ympyräriippuvuudet, oletetaan, että tietty riippuvuus lasketaan tässä tapauksessa vain kerran.
  • Riippuvuustila
    • Staattinen riippuvuus - Riippuvuus on läsnä kaikissa tapauksissa.
    • Dynaaminen riippuvuus - Riippuvuuden muutokset käytössä ja muissa yhteyksissä
  • Riippuvuus ulkoisista palveluista, kuten API:n käytöstä
  • Suoritusriippuvuus – ohjelmiston suorittamiseen vaadittavat riippuvuudet. Huomaa, että tietynlaiset riippuvuudet jätetään tyypillisesti pois laskuista, kuten alla on kuvattu. Nämä voivat olla yksi tai useampi seuraavista:
    • Rakennusriippuvuus – Ohjelmiston rakentamiseen tarvitaan koodi
    • Testiriippuvuus – Koodi vaaditaan ohjelmiston testaamiseen
    • Runtime Dependency - Koodi vaatii ohjelmiston suorittamisen
  • Kielen ajonaikaisen riippuvuuden yksityiskohdat (eli Pythonin ajonaikainen ympäristö)? (oletus ei). Nämä tiedot annetaan, koska ajonaikaiset riippuvuudet ovat tärkeitä turvallisuuden kannalta kriittisten järjestelmien laadunvarmistuksen kannalta.
    • Usein käytettävän kielen ajonaikaa ohjaavat virtuaaliympäristöt, esim. venv Pythonissa ; Rubyssa, jota käytät usein rbenv or RVM toteuttaa (ja tyypillisesti sisältyy "Gemfile" tai "Gemfile.lock" ja .ruby-version)
    • PyPi lisää jatkuvasti "kieltäytymistä kääntämästä yhteensopimattomia kirjastoja/riippuvuuksia" -logiikkaa. Se alkaa "rikkoa rakentaa".
    • Valitettavasti kaikissa pakkausjärjestelmissä ei ole käytäntöä kaikkien transitiivisten riippuvuuksien versiotietojen tallentamiseksi edes niiden ekosysteemin sisällä (pitkällä aikavälillä sen pitäisi olla)
    • Joissakin järjestelmissä on monia mahdollisia suoritusaikoja, joita voi olla vaikea erottaa. (Esimerkiksi Common Lisp -sovelluksella on monia toteutuksia ja usein mikä tahansa niistä toimisi.)
  • Kielen sisäänrakennettujen kirjastojen määrä (esim. "re" Pythonissa)? (oletus ei)
    • Tyypillisesti monet sisäänrakennetut kirjastot ovat suoritettavia riippuvuuksia. Ne asennetaan kuitenkin yleensä "massana" valitsemalla kielitoteutus, ja ne jätetään usein pois laskennasta analyysin yksinkertaistamiseksi.
    • Esimerkki: Oletuksena pip freeze ei sisällä tämäntyyppisiä "sisältyy kieleen" -kirjastoja/riippuvuuksia.
  • Saman riippuvuuden useat versiot lasketaan itsenäisesti. Jotkut järjestelmät tukevat useita versioita samasta riippuvuudesta järjestelmässä; tällaisissa tapauksissa ne lasketaan erikseen.

Huomautus: Usein on tärkeää antaa tietoja kielen toteutuksen pää- ja sivuversiosta suorituksen aikana.

  • Jotkut laskelmat ja analyysit tarvitsevat tätä tietoa. Usein kielten suoritusajat ja sisäänrakennetut kirjastot jätetään pois (katso edellä), ja nämä tiedot toimivat lyhenteenä näiden lisätietojen antamiseen.
  • Esimerkki: Ruby-ekosysteemi tukee kielen ajonaikaisen version määrittämistä Gemfilesissa ja .ruby-version tiedostossa.
  • Esimerkki: PyPi:n ja Anacondan Python-julkaisut kuroivat usein eri versioita kirjastoista eri tavoin.

Suodattimet

  • Trendit ajan mittaan (esim. olenko riippuvainen useammista vai harvemmista projekteista kuin viime vuonna)
  • Jokaisen riippuvuuden versioiden määrä
  • Viittausten määrä samaan riippuvuuteen

visualisointeja

Suorat riippuvuudet

Transitiiviset riippuvuudet

Pyöreät riippuvuudet

Mittarin antavat työkalut

Tiedonkeruustrategiat (valinnainen)

Osallistujat

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