.NET Core(csproj)global.json中的“projects”等效内容

12
在使用 .net core (project.json) 时,我曾通过将源代码路径添加到 global.json 中的 projects 字段来在 nuget packages 和源代码之间进行切换。添加完成后,它会添加所有可以在该路径中找到并替代我引用的 nuget 包的项目。

我经常使用此功能,因为我有自己的 nuget packages,但我想在发布之前测试我的其他项目中的更改。但是,一旦切换到 Sdk 1.0.0/VS 2017/csproj .net core,这个功能好像消失了。

另一种选择就是手动添加每个项目,手动切换引用(因为它们被分成了项目、nuget 和 sdk 引用),然后再切换回来。

如果有任何想法或建议,那就太好了。

更新: 听起来在 csproj 中没有相应的功能(预料之中),但现在有 msbuild 的解决办法(截至最初的 VS 2017/.NET Core SDK 1.0.0 发布)。

并非所有内容都映射到基于新csproj的系统。 - Lex Li
有一个请求要创建一个工具 https://github.com/dotnet/sdk/issues/1151 - 目前仍然是开放状态。 - Michael Freidgeim
3个回答

13

是的,我也习惯了这个功能,并围绕它建立了我的工作流程。我仍在寻找解决方案,但目前正在考虑在csproj文件中使用条件逻辑的想法。既然现在是msbuild,你可以这样做:

    <Choose>
    <When Condition="Exists('..\..\..\MyProject')">
        <ItemGroup>
            <ProjectReference Include="..\..\..\MyProject\src\MyProject\MyProject.csproj" />
        </ItemGroup>
    </When>
    <Otherwise>
        <ItemGroup>
            <PackageReference Include="MyProject" Version="1.0.0" />
        </ItemGroup>
    </Otherwise>
</Choose>
这将硬引用到一个包替换为条件引用,如果可以找到源代码(在此情况下是目录),则使用项目引用,否则使用包引用。
因此,默认情况下,您将引用包,但如果您想调试您的项目之一,则需要在有条件检查的位置检出该项目,并将该项目添加到解决方案中。
这样,您只需要在想要包含源代码时更改解决方案文件(通过添加项目),而无需重新连接所有项目引用。

很有趣,我自己并不太熟悉自定义 msbuild 逻辑,但我会尝试一下。谢谢。 - Gekctek

1

0
你想在你的.csproj文件中做类似这样的事情吗?
<Target Name="DeleteLocalCache" BeforeTargets="Pack">
  <RemoveDir Directories="$(NugetPackageRoot)$(PackageId.ToLower())\$(version)" />
  <Message Text="Cleaning $(NugetPackageRoot)$(PackageId.ToLower())\$(version)" />
</Target>

<Target Name="UpdateLocalCache" AfterTargets="Pack">        
  <Message Text="creating diretory $(NugetPackageRoot)$(PackageId.ToLower())\$(version)" Importance="high" />
  <MakeDir Directories="$(NugetPackageRoot)$(PackageId.ToLower())\$(version)" />
  <Message Text="copying file $(PackageOutputPath)$(AssemblyName).$(version).nupkg" Importance="high" />
  <Copy SourceFiles="$(PackageOutputPath)$(AssemblyName).$(version).nupkg" DestinationFolder="$(NugetPackageRoot)$(PackageId.ToLower())\$(version)" />
        
  <Exec Command="tar -xf $(NugetPackageRoot)$(PackageId.ToLower())\$(version)\$(AssemblyName).$(version).nupkg -C $(NugetPackageRoot)$(PackageId.ToLower())\$(version)" />
  <Exec Command="certutil -hashfile $(NugetPackageRoot)$(PackageId.ToLower())\$(version)\$(AssemblyName).$(version).nupkg SHA512 &gt; $(NugetPackageRoot)$(PackageId.ToLower())\$(version)\temp1.txt" />
  <Exec Command="more +1 $(NugetPackageRoot)$(PackageId.ToLower())\$(version)\temp1.txt &gt; $(NugetPackageRoot)$(PackageId.ToLower())\$(version)\temp2.txt " />
  <Exec Command="powershell Get-Content $(NugetPackageRoot)$(PackageId.ToLower())\$(version)\temp2.txt -First 1 &gt; $(NugetPackageRoot)$(PackageId.ToLower())\$(version)\$(AssemblyName).$(version).nupkg.sha512" />
  <Exec Command="del /f $(NugetPackageRoot)$(PackageId.ToLower())\$(version)\temp1.txt" />
  <Exec Command="del /f $(NugetPackageRoot)$(PackageId.ToLower())\$(version)\temp2.txt" />
</Target>

https://github.com/NuGet/Home/issues/6579


请记住,Stack Overflow 不仅旨在解决当前的问题,而且也旨在帮助未来的读者找到类似问题的解决方案,这需要理解基础代码。对于我们社区的初学者和不熟悉语法的成员来说,这尤其重要。鉴于此,你可以编辑你的答案以包含你正在做什么的解释以及为什么你认为这是最好的方法吗? - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接