【发布时间】: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 版本的文件(使用编译器指令,例如NET35、NET34_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.config。 packages.config 不仅包含项目中使用的依赖项或其版本,还包含需要哪个框架版本的依赖项。这有点问题,因为每个项目文件(对于每个框架目标)都驻留在同一个文件夹中,所以他们需要以某种方式共享同一个 packages.config 文件。我曾尝试将项目文件重新定位到不同的结构,如下所示:
MyProject.sln
target\
net40\MyProject.Net40.csproj
src\
File1.cs
...但是我无法在我的源文件夹中保留文件夹结构(如果有的话),因为项目文件只允许我包含文件,而不是文件夹(它们会被自动包含。)有什么办法可以解决这个问题,还是 NuGet 根本不适合多目标构建?
【问题讨论】:
标签: c# visual-studio visual-studio-2012 msbuild nuget