Тестирование пакетов nuget локально - PullRequest
0 голосов
/ 04 мая 2018

Я работаю над одним проектом OSS, который использует nuget для распространения своих пакетов.

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

Так что я бы хотел предотвратить слияние непригодного кода в главную ветвь.

Я удалил все локальные ссылки и создал следующее событие перед сборкой:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn/CodeGeneration.Roslyn.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Attributes/CodeGeneration.Roslyn.Attributes.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Tasks/CodeGeneration.Roslyn.Tasks.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Tool/CodeGeneration.Roslyn.Tool.csproj&quot;" />
  </Target>

Хорошо, теперь он упаковывает все необходимые проекты. Тогда я хочу сослаться на них. Теперь моя предварительная сборка выглядит так:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn/CodeGeneration.Roslyn.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Attributes/CodeGeneration.Roslyn.Attributes.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Tasks/CodeGeneration.Roslyn.Tasks.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Tool/CodeGeneration.Roslyn.Tool.csproj&quot;" />

    <Exec Command="Install-Package CodeGeneration.Attributes -Source &quot;$(SolutionDir)../bin/Packages/$(Configuration)&quot;" />
    <Exec Command="Install-Package CodeGeneration.Tasks -Source &quot;$(SolutionDir)../bin/Packages/Packages/$(Configuration)&quot;" />
    <Exec Command="Install-Package CodeGeneration.Roslyn -Source &quot;$(SolutionDir)../bin/Packages/Packages/$(Configuration)&quot;" />
    <Exec Command="Install-Package dotnet-codegen -Source &quot;$(SolutionDir)../bin/Packages/Packages/$(Configuration)&quot;" />
  </Target>

Но это не работает из-за:

Install-Package: не найдено совпадений по заданным критериям поиска и имя пакета «CodeGeneration.Attributes». Tr y Get-PackageSource чтобы увидеть все доступные источники зарегистрированных пакетов. В строке: 1 символ: 1 + Install-Package CodeGeneration.Attributes -Source C: \ Users \ Alex \ Sourc ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: ObjectNotFound: (Microsoft.Power .... InstallPackage: InstallPackage) [Install-Package], Исключение + FullyQualifiedErrorId: NoMatchFoundForCriteria, Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

Кажется, что он не любит предварительные версии пакетов (они выглядят как CodeGeneration.Roslyn.0.4.38-gfe7ce5be9d.nupkg), хорошо, проверяя документацию и пытаясь добавить флаг -IncludePrerelease, но он тоже не работает:

Install-Package: не найден параметр, соответствующий параметру название «IncludePrerelease». В строке: 1 символ: 126 + ... os \ CodeGeneration.Roslyn \ src ../ bin / Packages / Debug -IncludePrerelease + ~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidArgument: (:) [Install-Package], ParameterBindingException + FullyQualifiedErrorId: NamedParameterNotFound, Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

Как это могло быть сделано? Может быть, есть другой подход, который проще и лучше? Я описал это так подробно, потому что не хочу попадать в ловушку X-Y.

1 Ответ

0 голосов
/ 07 мая 2018

Локальное тестирование пакетов nuget

Когда мы собираем проект с помощью Visual Studio, командная строка события сборки имеет те же параметры среды, что и командная строка.

Однако команду Install-Package [-Id] <string> [[-Source] <string>] следует выполнять в консоли диспетчера пакетов NuGet , а не в командной строке. Поскольку, когда мы устанавливаем пакет nuget в проект, NuGet изменяет файл проекта (.csproj) для включения ссылок, ему необходим API-интерфейс NuGet в Visual Studio . Когда мы выполняем командную строку в командной строке (событие Build), nuget не может получить доступ к API NuGet в Visual Studio, поэтому установка пакета nuget через событие build не будет успешной.

Проверить дополнительную информацию по этой теме .

Временное решение для автоматизации установки пакетов nuget в проект. Можно использовать Visual Studio 2017 (15.3 и более поздние версии) и стиль ссылок на проекты PackageReference, добавить файл Directory.Build.props в корневой каталог. вашего решения, файл как:

<Project>
  <ItemGroup>
    <PackageReference Include="CodeGeneration.Roslyn" Version="0.4.38-gfe7ce5be9d" />
  </ItemGroup>
</Project>

См. Ответ Мартина для более подробной информации.

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