Предполагая, что поведение Карго и Трэвиса существенно не изменилось с тех пор, как этот вопрос был опубликован, здесь есть пара вещей.
- Всякий раз, когда изменяется конфигурация сборки, меняется отпечаток вашей сборки, что приводит к полной или частичной перестройке и новому имени файла для полученного двоичного файла в
target
. По общему признанию, я не знаю тонкостей того, когда и почему это происходит, я просто знаю, что это происходит. На самом деле, для проекта, над которым я работаю, Cargo кажется настолько смущенным одной из зависимостей, что он вызывает перестройку почти каждый раз.
- Travis '
cache: cargo
по умолчанию довольно тупой; он кэширует все $CARGO_HOME
и target
без исключений. Обратите внимание, что это в сочетании с первым также означает, что эти кэши растут без ограничений, поэтому вам нужно время от времени выбрасывать их или использовать более разумную схему кэширования.
for file in target/debug/myproject-*[^\.d]
запускает kcov для всех сборок myproject
, независимо от того, была ли она недавно построена или из кеша сборки Travis. Старые сборки могут, конечно, иметь разные номера строк, поскольку они были построены из разных (более старых) источников, и охват может быть разным.
- cover.io объединяет результаты покрытия, выделяя красную строку, если она включена в любой отчет, если только он не охватывается любым (другим) отчетом. Он не показывает никаких признаков того, что номера строк в разных отчетах не совпадают или даже если один из отчетов содержит номера строк, превышающие EOF. На самом деле, насколько я мог найти, он даже не показывает, какие двоичные файлы покрывали / не покрывали номер строки, даже если он имеет эту информацию. Вы должны скачать отчеты XML и интерпретировать их вручную, чтобы увидеть это.
Следовательно, эти непокрытые строки могут (не все?) Происходить из-за того, как Rust компилирует свои двоичные файлы, как подсказывают комментарии к вопросу, но на самом деле могут полностью ссылаться на другой (более старый) исходный файл. Это стало довольно очевидным в нашем проекте через некоторое время ...
Если это не так очевидно, самый простой способ убедиться в том, что это происходит, - просто выбросить кэш сборок Трэвиса и вызвать перестроение.
Поскольку инкрементные сборки на самом деле не работают для нашего проекта, решение, которое мы использовали, заключалось в том, чтобы Travis просто не кэшировал целевой каталог, как предлагалось здесь . В зависимости от того, насколько ваше время сборки CI зависит от инкрементных сборок, вы можете быть вынуждены сделать что-то более умное.