【问题标题】:Build, pack up and deploy for multiple platform targets为多个平台目标构建、打包和部署
【发布时间】:2015-09-19 16:06:47
【问题描述】:

我期待设置允许我为多个平台/目标构建和部署自定义库的环境/配置,例如构建配置和/或 .NET 框架版本。为此,我制定了以下结构:

MyProject.sln
src\
   File1.cs
   File2.Net30.cs
   MyProject.Net40.csproj
   MyProject.Net30.csproj
   MyProject.Net45.csproj

所有项目文件都包含在解决方案中并立即构建。每个项目都包含它所针对的框架的源文件和/或所有有条件地编译不同 .NET 版本的文件(使用编译器指令,例如NET35NET34_OR_GREATER)。此外,每个项目文件都包含以下 msbuild 指令:

<OutputPath>bin\$(Configuration)\$(Platform)\$(TargetFrameworkVersion)\$(TargetFrameworkIdentifier)\</OutputPath>
<BaseIntermediateOutputPath>obj\$(Configuration)\$(Platform)\$(TargetFrameworkVersion)\$(TargetFrameworkIdentifier)\</BaseIntermediateOutputPath>
<DocumentationFile>bin\$(Configuration)\$(Platform)\$(TargetFrameworkVersion)\$(TargetFrameworkIdentifier)\$(AssemblyName).xml</DocumentationFile>

这允许我通过将输出路由到不同的目录来一次构建它们。

现在,这就是构建的全部内容。但是,我真的被部署困住了,尤其是与 NuGet 相关的。我创建了一个 .nuspec,在其中手动包含每个依赖项:

<file src="bin\Release\AnyCPU\v4.0\MyProject.dll" target="lib\net40-client\EIT.Foundation.dll" />
<file src="bin\Release\AnyCPU\v4.0\MyProject.xml" target="lib\net40-client\EIT.Foundation.xml" />
<file src="bin\Release\AnyCPU\v4.5\MyProject.dll" target="lib\net45\MyProject.dll" />

这很好用,但确实很乏味。所以第一个问题:有没有办法自动连接文件?

还有我的第二个问题:有时我的库本身就有 NuGet 依赖项。对于项目依赖项,在下载 NuGet 依赖项时,会在与项目相同的文件夹中自动创建一个 packages.configpackages.config 不仅包含项目中使用的依赖项或其版本,还包含需要哪个框架版本的依赖项。这有点问题,因为每个项目文件(对于每个框架目标)都驻留在同一个文件夹中,所以他们需要以某种方式共享同一个 packages.config 文件。我曾尝试将项目文件重新定位到不同的结构,如下所示:

MyProject.sln
target\
   net40\MyProject.Net40.csproj
src\
   File1.cs

...但是我无法在我的源文件夹中保留文件夹结构(如果有的话),因为项目文件只允许我包含文件,而不是文件夹(它们会被自动包含。)有什么办法可以解决这个问题,还是 NuGet 根本不适合多目标构建?

【问题讨论】:

    标签: c# visual-studio visual-studio-2012 msbuild nuget


    【解决方案1】:

    虽然 NuGet 支持为特定项目创建 NuGet 包,但它是针对单个项目的。命令是NuGet pack YourProject.csproj,所以我怀疑它对你没有帮助。使用 .nuspec 文件可能是实现此功能的唯一方法。

    如果重命名 packages.config 文件,NuGet 支持同一目录中的多个项目。每个 packages.config 文件都应该以项目命名。因此,在您的示例中,以下内容应该有效:

    • packages.MyProject.Net40.config
    • packages.MyProject.Net30.config
    • packages.MyProject.Net45.config

    【讨论】:

    • 正是我想要的。我认为重命名 packages.config 会使 NuGet 无法找到依赖项,但它实际上似乎工作。 :)
    • 它不是广为人知的 NuGet 功能。 NuGet 2.8 release notes 中有一段关于它,但这是我除了阅读源代码之外看到的唯一文档:)
    • 赞成做上帝的工作并实际研究 nuget 源以弄清楚如何做事。 (不是每个人都有时间)。 :)
    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多