.NET Core в Linux через `dotnet` не учитывает Directory.Build.props CodeAnalysisRuleSet, сборка не может найти указанный файл - PullRequest
0 голосов
/ 01 ноября 2019

Я пытался решить проблемы стилей здесь и успешно использовал Directory.Build.props. Когда я открываю свой проект в Rider или VS2019, он компилирует файл и учитывает набор правил, который находится в каталоге решений верхнего уровня. Я также назвал его в точности так, как написал, из-за примечания о чувствительности к регистру при работе в Linux.

Я запускаю свои модульные тесты на TravisCI, поэтому файл .travis.yml выглядит как

dist: xenial
addons:
  snaps:
  - name: dotnet-sdk
    classic: true
    channel: latest/beta
sudo: required
language: csharp
mono: none
script:
  - sudo snap alias dotnet-sdk.dotnet dotnet
  - cd Tests
  - dotnet build
  - dotnet test

Сборка использовалась , чтобы нормально работать, когда я выполнял GlobalSuppressions.cs внутри файла проекта, но теперь, когда я применил его через .ruleset ко всем проектам в решении,сейчас возникают проблемы.

Основная проблема возникает из-за этой строки:

/snap/dotnet-sdk/49/sdk/3.0.100/Microsoft.CSharp.CurrentVersion.targets(135,9): warning MSB3884: Could not find rule set file "Rules.ruleset". [/home/travis/build/user/project/SomeProj/SomeProj.csproj]

Это в конечном итоге является проблемой, поскольку заполняет консоль TravisCI многими тысячами строк ошибок, поэтомутем более, что он завершает работу из-за переполнения консоли и убивает сборку.

Чтобы попытаться решить эту проблему, я сначала вручную скопировал вставленный Rules.ruleset из каталога верхнего уровня в папку проекта. Это работало нормально! Однако это, очевидно, не то, что мы хотим, и именно поэтому Directory.Build.props используется, чтобы обойти это.

Я попытался добавить какое-то включение в файл Directory.Build.props следующим образом:

<Project>
  <PropertyGroup>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <CodeAnalysisRuleSet>$(SolutionDir)Rules.ruleset</CodeAnalysisRuleSet>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="$(SolutionDir)Rules.ruleset" Link="Rules.ruleset" CopyToOutputDirectory="PreserveNewest" />
    <PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>
</Project>

Теперь элемент отображается в моих IDE, но он все равно выдает то же предупреждение при сборке, что не может найти Rules.ruleset на TravisCI.

Интересно то, что он делаетЗапустите Directory.Build.props в Linux, потому что он правильно применяет анализаторы StyleCop ко всем проектам, но по какой-то причине <CodeAnalysisRuleSet>$(SolutionDir)Rules.ruleset</CodeAnalysisRuleSet> не устанавливается правильно или не соблюдается.

Чтобы проверить, если $(SolutionDir) был установлен или нет, я добавил это в базовый файл csproj:

<Target Name="DisplayMessages">
  <Message Text="SOLUTIONDIR = $(SolutionDir)" />
</Target>

однако это ничего не печатает для меня, когда я смотрю на сборку / вывод при тестировании в Windows. Возможно, я делаю что-то здесь не так. Если есть способ сделать это правильно, дайте мне знать, потому что это поможет мне определить, правильно ли установлена ​​переменная каталога решения (хотя, вероятно, очень маловероятно, поскольку я предполагаю, что у многих проектов возникнут проблемы).

Единственное, о чем я мог подумать, это написать какой-нибудь bash-скрипт, который копирует и вставляет файл набора правил перед вызовом dotnet шагов сборки / тестирования, но это немного глупо, и я бы не стал этого делать, если моя спина не противwall.

Как я могу сделать так, чтобы мой набор правил получал правильную ссылку из файла .csproj, если не используется IDE, в частности, для сборки на Linux?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...