Msbuild 将项目引用视为PackageReference或允许PackageReference到本地csproj

Msbuild 将项目引用视为PackageReference或允许PackageReference到本地csproj,msbuild,visual-studio-2017,.net-core,nuget,msbuild-15,Msbuild,Visual Studio 2017,.net Core,Nuget,Msbuild 15,我有一个netstandard2.0csproj(我们称之为MyPackage),它在构建时打包(由GeneratePackageOnBuild指定)到一个nuget包中。这个nuget包在构建目录中有自定义的道具和目标(因此引用项目会导入这些道具和目标) 在同一个解决方案中,我有另一个项目(我们称之为MyConsumer)用于测试MyPackage。我希望MyConsumer在构建时将构建资产道具和目标从MyPackage导入,就像它将其作为来自某个远程nuget源的PackageRefere

我有一个netstandard2.0csproj(我们称之为MyPackage),它在构建时打包(由GeneratePackageOnBuild指定)到一个nuget包中。这个nuget包在构建目录中有自定义的道具和目标(因此引用项目会导入这些道具和目标)

在同一个解决方案中,我有另一个项目(我们称之为MyConsumer)用于测试MyPackage。我希望MyConsumer在构建时将构建资产道具和目标从MyPackage导入,就像它将其作为来自某个远程nuget源的PackageReference使用一样

我怎样才能让它工作(最简单)

我已经能够通过一种非常复杂的方法来实现这一点,我让MyConsumer向MyPackage添加一个PackageReference,并覆盖MyConsumer中的RestoreSources以指向MyPackage的bin目录。在运行sln的dotnet build或Visual Studio build时,这会变得非常奇怪,因为在恢复过程中会为所有项目预先生成项目元数据,所以此时MyPackage不存在。解决方案是在MyConsumer项目中添加对MSBuild的嵌套调用,但这会变得更糟,因为Visual Studio恢复的操作与dotnet build执行的自动恢复完全不同

有什么简单的方法可以做到这一点吗

这就是我现在拥有的

<Project> 
  <Target Name="Build">    
    <Message Text="Running inner build" Importance="high" />

    <!-- 
    Need to call MSBuild twice, once to restore, then again to restore and build to get the restore of the Sdk to work
    because of this bug in MSBuild: https://github.com/Microsoft/msbuild/issues/2455
    Note the trailing Prop=1 is required to get MSBuild to invalid it's cache of the project target imports
    -->
    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Restore" Properties="Configuration=$(Configuration);Version=$(Version);IsInnerBuild=true;Prop=1" />
    <!-- Have to use dotnet build instead of another call to MSBuild because of another bug that prevents proper imports within the same physical process  -->
    <Exec Command="dotnet build /p:Configuration=$(Configuration) /p:Version=$(Version) /p:IsInnerBuild=true" />
    <Message Text="Finished inner build" Importance="high" />
  </Target>

  <Target Name="Restore" />

  <Target Name="RemoveBin">
    <RemoveDir Directories="bin" />
  </Target>

  <!-- Don't do real cleans old rebuild since it breaks MSBuild due to the same above bug -->
  <Target Name="Rebuild" DependsOnTargets="RemoveBin;Build">
  </Target>
</Project>

将项目引用视为PackageReference或允许PackageReference到本地csproj

如果我理解您的意思是正确的,您希望使用project
MyPackage
生成包,然后将其安装到测试项目
MyConsumer
,并在构建时从MyPackage导入构建资产道具和目标

要实现此目标,您需要完成以下几件事:

  • 确保项目
    MyPackage
    在项目
    MyConsumer
    之前构建
  • 将包设置到打包机源中
  • 在构建期间,将包
    MyPackage.nupkg
    添加到测试项目
    MyConsumer
以上详情:

  • 确保项目
    MyPackage
    在项目
    MyConsumer
    之前构建
由于您希望测试由项目生成的包
MyConsumer
,因此您应该确保在使用该包测试项目之前生成该包,因此我们需要设置项目
MyConsumer
参考项目
MyPackage

  • 将包设置到打包机源中
您可以使用项目
MyPackage
的生成后事件将包
MyPackage.nupkg
复制到本地提要,也可以将
MyPackage.nupkg
的bin目录添加到包源

  • 在构建期间,将包
    MyPackage.nupkg
    添加到测试项目
    MyConsumer
使用VS 2017和测试项目
MyConsumer
PackageReference
样式,您可以设置
目录。将.props
文件构建到包含测试项目
MyConsumer
的解决方案的根目录中,您需要:

<Project>
  <ItemGroup>
    <PackageReference Include="MyPackage" Version="1.0.* />
  </ItemGroup>
</Project>


这很好,但正是我在做的。这种方法的问题是MSBuild在恢复包和解决特定于包的生成目标方面的“问题/错误/您想称之为什么”问题。请参阅以上问题的答案,了解实现此功能所需的所有复杂性…@杰夫,是的,你是对的。如果您使用的是dotnet构建解决方案,那么您将遇到“项目元数据是在恢复期间为所有项目预先生成的,因此MyPackage此时不存在”的问题。要解决此问题,可以先使用MSBuild生成项目
MyPackage
,然后使用
MSBuild/t:restore
还原解决方案的包。目前,我们似乎没有任何简单的解决方案。谢谢利奥。对MSBuild 15和nuget集成的增强非常好,但是由于没有测试和开发的方法,我们只剩下了有缺陷的、不成熟的解决方案。我将坚持采用复杂的方法。请注意,它并不像构建/恢复那么简单,即使是因为MSBuild如何进行缓存的各种错误(请参阅我上面发布的代码示例中的注释)