У меня есть скрипт сборки тортов с моим проектом сервера .NET, который должен быть построен на нашем новом конвейере Azure DevOps. Сценарий работает локально, но не работает в DevOps Azure. Это может быть вызвано тем, что у меня есть проект модульных тестов (xUnit), построенный на .NET Core 2.1, в то время как все остальные проекты в решении - это .NET Framework 4.6.1 (мы только что добавили в проект xUnit, который мой единственный можно было добавить его как проект .NET Core).
Я написал свой скрипт для торта, который работает локально. Это выглядит так:
//Always lock down versions of tools so that we can ensure a tool works before upgrading instead of auto-upgrading.
#tool "nuget:?package=xunit.runner.console&version=2.4.1"
#tool "nuget:?package=ReportUnit&version=1.2.1"
var target = Argument("target", "Build");
var configuration = Argument("configuration", "Dev");
var solution = @".\MyCompany.MyProduct.IntegrationLayer.sln";
var report = Directory(@".\reports");
var xunitReport = report + Directory("xunit");
Task("Clean")
.Does(() =>
{
Information("Cleaning out directories {0} for {1}...", configuration, solution);
CleanDirectories("./**/bin/" + configuration);
CleanDirectories("./**/obj/" + configuration);
});
Task("Restore")
.IsDependentOn("Clean")
.Does(() =>
{
//This can restore both .NET Core and Framework NuGet packages.
Information("Restoring Nuget packages for {0}...", solution);
DotNetCoreRestore();
});
Task("Build")
.IsDependentOn("Restore")
.Does(() =>
{
//If we change all the projects and solution to .NET Core, then we will need to change this build call to DotNetCoreBuild().
//Because we have a mixed solution (unit tests are .NET Core and all other projects are .NET Framework), we need to still use MSBuild.
Information("Building solution {0} using the {1} configuration...", solution, configuration);
MSBuild(solution, new MSBuildSettings {
Configuration = configuration
});
});
Task("UnitTests")
.IsDependentOn("Build")
.Does(() =>
{
Information("Unit testing solution {0} using the {1} configuration...", solution, configuration);
var projects = GetFiles("./UnitTests/*.csproj");
foreach(var project in projects)
{
DotNetCoreTest(
project.FullPath,
new DotNetCoreTestSettings()
{
Configuration = configuration,
NoBuild = true
});
}
});
Task("UnitTestsOnly")
.Does(() =>
{
Information("Unit testing solution {0} using the {1} configuration...", solution, configuration);
var projects = GetFiles("./UnitTests/*.csproj");
foreach(var project in projects)
{
DotNetCoreTest(
project.FullPath,
new DotNetCoreTestSettings()
{
Configuration = configuration,
NoBuild = true
});
}
});
RunTarget(target);
Теперь, когда я запускаю это в Azure DevOps, я получаю 10 ошибок для каждого проекта, как показано в следующем примере:
"D:\a\1\s\PPIL\MyCompany.MyProduct.IntegrationLayer.sln" (Build target) (1) ->
"D:\a\1\s\PPIL\MC.MP.IL.DatabaseDataReset\MC.MP.IL.DatabaseDataReset.csproj" (default target) (11) ->
D:\a\1\s\PPIL\MC.MP.IL.DatabaseDataReset\MC.MP.IL.DatabaseDataReset.csproj(123,5): error : This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\Microsoft.VisualStudio.SlowCheetah.3.1.66\build\Microsoft.VisualStudio.SlowCheetah.targets.
Я не совсем уверен, в чем проблема. Это может быть потому, что у нас смешанный проект. Это может быть потому, что структура файла. Я не знаю, какие опции или настройки мне нужно было бы установить в командах тортов для сборки или восстановления. Это также может быть, когда я запускаю это локально, я запускаю его в той же папке, что и сценарий Cake, но, похоже, он выполняется в корневой папке моего репозитория, которая находится на одну папку выше папки решения для этого решения.
Где в моем сценарии я ошибаюсь? Мой шаг восстановления кажется хорошим, за исключением того, что он только восстанавливает проект UnitTests (который зависит от всех других проектов). Это восстановление? Есть ли настройки, которые мне не хватает в сборке или восстановлении? Заранее спасибо.