Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让Linux和OS X用户构建基于MSBuild的项目?_C#_.net_Build_Msbuild_Cross Platform - Fatal编程技术网

C# 如何让Linux和OS X用户构建基于MSBuild的项目?

C# 如何让Linux和OS X用户构建基于MSBuild的项目?,c#,.net,build,msbuild,cross-platform,C#,.net,Build,Msbuild,Cross Platform,我有一个用C#编写的小型开源项目,我通常使用Visual Studio来编辑、构建、调试等。当然,这意味着我的repo的贡献者必须在他们的机器上有一个MSBuild的工作副本,我的构建脚本才能正常工作 这对Windows用户来说没有问题,因为Visual Studio默认安装它,但是*nix用户呢?以下是我迄今为止提出的一些选择: 在repo中包含MSBuild.exe。虽然这看起来是一件显而易见的事情,但我遇到了一系列奇怪的副作用,因为它丢失了许多我忘记与可执行文件一起复制的配置文件。这也大

我有一个用C#编写的小型开源项目,我通常使用Visual Studio来编辑、构建、调试等。当然,这意味着我的repo的贡献者必须在他们的机器上有一个MSBuild的工作副本,我的构建脚本才能正常工作

这对Windows用户来说没有问题,因为Visual Studio默认安装它,但是*nix用户呢?以下是我迄今为止提出的一些选择:

  • 在repo中包含MSBuild.exe。虽然这看起来是一件显而易见的事情,但我遇到了一系列奇怪的副作用,因为它丢失了许多我忘记与可执行文件一起复制的配置文件。这也大大增加了我的回购规模,达到319KB,因此我对这个选项的把握比以前要小

  • 从在线源下载。例如,有一个在线位置,您可以在其中下载可执行文件,因此您可以将其作为构建脚本的一部分自动安装,而不是将其托管在repo中。然而,对于MSBuild,它对我来说似乎是非常高的维护

  • 强制用户在特定路径上安装MSBuild。虽然这听起来更容易实现,但很容易出错,因为用户可能会复制粘贴
    MSBuild.exe
    并忘记包含那些超级重要的配置文件,然后想知道为什么单元测试突然无法工作。此外,在磁盘上已经有可执行文件的情况下,这样做有点烦人

  • 强制用户在其路径中使用MSBuild。这没有上一个选项的缺点,但我不想强制我的贡献者必须配置任何东西,因为我打赌如果我这样做,他们中的大多数人都会选择退出

  • 将路径作为命令行参数传递给MSBuild。再说一次,虽然这比其他一些选项的维护要低得多,但我不希望用户每次要生成时都输入可执行文件的路径


是否有我遗漏的替代方案?

您的第五个选项很好,只需缓存传递的路径,这样用户就不必每次都拼出来

构建脚本示例:

#!/bin/bash

scriptroot="$(cd "$(dirname $0)" && pwd -P)"
cachefile="$scriptroot/$(basename $0).cache"

if [ ! -z $1 ]
then
    msbuildpath=$1/MSBuild.exe
    echo $msbuildpath > $cachefile
elif [ -e $cachefile ]
then
    msbuildpath=$(cat $cachefile)
else
    echo "Please specify the directory containing MSBuild."
fi

# To use: $msbuildpath (or mono $msbuildpath) foo.csproj

这个问题及其答案与IMHO不符。要在非Windows平台上构建某些东西,到目前为止,您只能从Mono使用
xbuild
,而Microsoft正在迅速将.NET Core和.NET Core的MSBuild迁移到此类平台。shell脚本尝试直接执行MSBuild.exe,这是我最关心的。你从哪里得到那个可执行文件的?我不认为您可以直接从Windows端使用它。@LexLi我以前也这么认为,但事实证明,由于MSBuild是用C#编写的,所以文件中包含的不是实际的机器代码,但IL与特定的操作系统无关,我关心的是二进制文件的许可以及Windows文件路径的设计。