如何在不调用每个项目的情况下获得dotnet构建来选择正确的框架?

时间:2018-05-03 20:30:15

标签: .net bash ubuntu .net-core

所以情况是我试图在Bamboo上构建一个构建这个包含许多项目的解决方案(它是一个共享库解决方案),每个都是一个nuget包。 Bamboo目前正在Ubuntu 16.04上运行。该解决方案包含库项目(netstandard2.0)和测试(netcoreapp2.0)。每个库都针对net461和netstandard2.0,因为它们在我们较新的.net核心2.0应用程序以及我们的4.6.1传统平台中都使用。

问题在于,如果我运行dotnet build mysolution.sln,那么cli会尝试在net461中构建所有内容,这显然会失败(linux机器)。但是如果我运行dotnet build mysolution.sln -f netstandard2.0,则测试无法构建,因为它们是netcoreapp2.0。

我唯一能想到的就是写入构建脚本,这是一个使用正确的框架构建每个项目的行,这对我来说似乎有些愚蠢。

幸运的是,所有的测试项目都以.Tests为后缀,所以我觉得可能有办法做一些find /path -regex 'match-csproj-where-not-tests' and so forth...伏都教,这样可以减少烦恼。我想知道是否有人可能知道一些关于dotnet cli的内容,这可能有助于解决这个问题,甚至提供正则表达式解决方案。

TIA

1 个答案:

答案 0 :(得分:1)

在我等待更好的选择时,我想出了这个:

#!/bin/bash

# build netstandard2.0
projects=($( find . -name '*.csproj' -print0 | xargs -0 ls | grep -P '(?![Tests])\w+\.csproj' ))
BUILDCODE=0
for proj in ${projects[@]}
do
    dotnet build $proj -f netstandard2.0
    BUILDCODE=$?
    if (($BUILDCODE != 0)); then
        echo "Failed to build $proj"
        break
    fi
done
(exit $BUILDCODE)

# build netcoreapp2.0
projects=($( find . -name '*.csproj' -print0 | xargs -0 ls | grep -P '\w+\.Tests\.csproj' ))
BUILDCODE=0
for proj in ${projects[@]}
do
    dotnet build $proj -f netcoreapp2.0
    BUILDCODE=$?
    if (($BUILDCODE != 0)); then
        echo "Failed to build $proj"
        break
    fi
done
(exit $BUILDCODE)

这会搜索非Test后缀项目,然后构建为netstandard2.0,后缀为Test,并将其构建为netcoreapp2.0。我将这些作为两个不同的构建任务插入,以确保退出代码导致失败,并且不会尝试继续。

我可能不得不做同样的事情来运行xUnit测试,因为dotnet test solution.sln失败,因为库项目不包含tests :: eye_roll ::