我正在实现一个新的解决方案,该解决方案取决于许多“仅内容” NuGet软件包。这些包括许多程序集和dacpacs,我需要参考。
我的意图是拥有一个SDK风格的csproj,它使用PackageReference元素引用所有软件包。然后,我计划使用Directory.Build.Props为解决方案中的所有其他项目提供对该项目的引用,以便首先对其进行构建(并且在构建开始时就可以使用我的所有依赖项)。>
这行得通,但是在这一点上,我添加了sqlproj来消耗dacpacs,这使我开始遇到麻烦(我已经在解决方案中添加了许多SDK样式的csproj文件,这些文件都按预期工作了)。
当使用sqlproj文件引用SDK样式的csproj文件时,我发现Visual Studio会在启动时挂起(记录在here中的已知错误)。
然后我尝试用传统的csproj文件替换该项目。下面是我Directory.Build.Props中的片段,这些片段是我尝试自动创建从csproj和sqproj到负责还原NuGet程序包的项目的引用的。
由于NuGet.Restore项目(现在是传统的csproj,因为它似乎不符合条件,因此获得了循环引用),因此以下命令无法工作:-
<ItemGroup Condition=" '$(MSBuildProjectName)'!='NuGet.Restore' ">
<ProjectReference Include="$(MSBuildThisFileDirectory)NuGet.Restore.csproj" />
</ItemGroup>
以下内容解决了循环引用,但是sqlproj无法在Visual Studio中加载,并显示错误“无法修改源自导入文件的评估对象”:-
<Choose>
<When Condition=" '$(MSBuildProjectName)'!='NuGet.Restore' ">
<ItemGroup>
<ProjectReference Include="$(MSBuildThisFileDirectory)NuGet.Restore.csproj" />
</ItemGroup>
</When>
</Choose>
是否还有其他方法可以通过伸缩Directory.Build.props使sqlproj引用到csproj(传统或SDK样式)与MSBuild 和 Visual Studio一起使用?
据我所知,确保MSBuild首先运行还原项目的唯一方法是使其他所有项目都引用它。
我正接近唯一可行的选择,那就是拥有一个单独的预构建脚本,在运行我们的解决方案构建之前,必须手动运行该脚本以检索NuGet软件包(我一直希望避免这种情况)。
答案 0 :(得分:0)
为此,我有一个解决方法/解决方案,将还原项目保留为传统的csproj。我已经修改了条件,因此它排除了sqlproj项目,然后将对我的NuGet恢复的引用手动添加到每个sqlproj文件中:-
refArr.size
(这可能并不适合所有人,但是由于我们不希望将来再添加任何其他sqlproj项目,因此希望不会给我们造成任何维护上的麻烦!)