Поддерживаемые экосистемы и способы анализа¶
Манифесты¶
Для поиска зависимостей CodeScoring в первую очередь опирается на разбор файлов манифестов пакетных менеджеров. Система поддерживает разбор следующих технологий:
Язык | Пакетный менеджер или инструмент сборки | Формат файла |
---|---|---|
Java и Kotlin | Gradle, Maven | pom.xml ivy.xml maven-dependency-tree.txt gradle-dependency-tree.txt *.gradle *.gradle.kts gradle.lockfile |
JavaScript и TypeScript | npm, yarn | package.json package-lock.json npm-shrinkwrap.json yarn.lock pnpm-lock.yaml |
Python | pip, Poetry, Pipenv, Conda | setup.py Pipfile Pipfile.lock pyproject.toml poetry.lock requirements.txt requirements.pip requires.txt environment.yml meta.yml conda-lock.yml |
С и C++ | Conan | conanfile.txt conan.lock conanfile.py |
Go | Go Modules | go.mod go.sum |
PHP | Composer | composer.json composer.lock |
Ruby | RubyGems | Gemfile Gemfile.lock *.gemspec gems.locked |
C# | Nuget | *.nuspec packages.lock.json Project.json Project.lock.json packages.config paket.dependencies paket.lock *.csproj project.assets.json |
Objective-C и Swift | CocoaPods | Podfile Podfile.lock *.podspec |
Rust | Cargo | Cargo.lock Cargo.toml |
Scala | sbt | scala-dependency-tree.txt sbt-dependency-tree.txt |
Лучший результат будет при наличии основного файла манифеста и соответствующего lock-файла, если он предусмотрен механизмом пакетного менеджера.
Механизм резолва при отсутствии lock-файла¶
При отсутствии lock-файла для некоторых пакетных индексов система будет пытаться выполнить резолв транзитивных OSS зависимостей сама следующим образом:
- Maven
- для формата pom.xml и build.gradle генерация maven-dependency-tree через соответствующий плагин maven
- используются Maven версии 3.8.3 и OpenJDK версии 11
- PyPi
- генерация poetry.lock с помощью пакетного менеджера Poetry
- используется Python версии 3.8
- NPM
- генерация yarn.lock с помощью пакетного менеджера Yarn
- используется Node.js версии 16
- Nuget
- для формата csproj генерация project.assets.json с помощью встроенных инструментов nuget
- используется .NET SDK версии 8
- Packagist
- генерация composer.lock с помощью пакетного менеджера Composer
- используется PHP версии 8
- Rubygems
- генерация Gemfile.lock с помощью пакетного менеджера Bundler
- используется Ruby версии 3
Самостоятельная генерация lock-файлов системой не может давать результат в 100% случаев, так как результат часто зависит от окружения.
Разрешение зависимостей в окружении¶
Пакетные менеджеры некоторых экосистем по умолчанию не включают транзитивные зависимости в манифесты. Для качественного проведения композиционного анализа при работе с ними рекомендуется применять механизм разрешения зависимостей в окружении сборки.
При разрешении зависимостей в окружении система проверяет отсутствие lock-файла, самостоятельно запускает пакетный менеджер или инструмент сборки и формирует полный список компонентов с учетом корректной версии сборки. На данный момент функциональность доступна для следующих экосистем:
- .NET
- Go
- Gradle
- Maven
- npm
- Poetry
- sbt
- yarn
- Conda
Механизм поиска зависимостей по хэшам¶
Второй механизм поиска зависимостей, реализованный в CodeScoring — это поиск по хэшам, то есть поиск непосредственного включения библиотек в код проектов путём копирования. В рамках этого механизма происходит хэширование всех файлов проекта и сверка этих сигнатур с известными нам open source библиотеками.
В данный момент поиск по хэшам происходит для следующих индексов пакетных менеджеров по следующим типам файлов:
- Maven
.jar
.war
.ear
- npm
.min.js
- PyPI
.whl
.egg
- Nuget
.nupkg
От инсталляции в облако не уходят хэши файлов, размер которых не превышает 512 байт.
Сканирование сборки для языков C и C++¶
В случае, если для сборки C/С++ проекта не используется пакетный менеджер Conan и соответствующие манифесты, для получения списка используемых библиотек можно использовать специальный режим для анализа вывода процесса сборки.
В данном режиме консольный агент Johnny анализирует процесс сборки, используя флаги компилятора и выявляя использованные библиотеки. Далее с помощью системного кэша определяется местоположение библиотек и их источник.