【问题标题】:dotnet core nuget package copying content files on restoredotnet core nuget 包在还原时复制内容文件
【发布时间】:2018-03-22 09:32:42
【问题描述】:

所以我觉得我已经走到了尽头,但希望有人比我知道的更多。我有一些 Typescript 文件,尽管这几乎无关紧要,因为我在所有内容文件中都遇到了这个问题。

我可以在我的parent 项目的.csproj 中使用它来生成一个nuget,或更准确地说是dotnet pack,nuget 包,其中包含我的内容文件:

<ItemGroup>
  <Content Include="Scripts\Utility.ts">
    <Pack>true</Pack>
    <PackagePath>contentFiles\Scripts\;content\Scripts</PackagePath>
  </Content>
</ItemGroup>

我可以浏览生成的.nupkg 并看到该文件确实已添加到包中的content\ScriptscontentFiles\Scripts 位置

问题是,每当我在我的“子”项目中使用这个包时,Typescript 永远不会被复制到 child 项目的任何文件夹中,尽管我可以看到它被提取到 .nuget\packages\parent\... 文件夹中。

起初我认为这是我在 parent 项目中的初始设置,可能是这样,但是在尝试了书中的所有内容后,无法将内容文件复制到 child 项目.然后我尝试在我的包的tools 文件夹中尝试使用Init.ps1 的黑暗路径,虽然无法调试,但它似乎也偶尔运行(我完全卸载并重新安装了包,但它仍然失败大部分时间都运行。)这可能是这种方式,但我不知道为什么我不能让它输出到Package Manager Console...也许Init.ps1仍有希望,但我似乎不能弄明白。最后,我看到了nuget .targets file 的一些潜力,但我似乎也掌握了如何将它用于我的目的!我希望得到一些关于如何完成这项工作的反馈。

【问题讨论】:

    标签: .net-core nuget dotnet-core-pack


    【解决方案1】:

    发件人: Announcing NuGet 3.1 with Support for Universal Windows Platform

    对于在 Nuget v3.1 中使用 project.json 文件的项目,从 Nuget 包中导入内容已被弃用。从那时起,project.json 文件已被删除,取而代之的是新的 .csproj 格式。如果您改用 packages.config 文件,从 Nuget 包导入内容应该仍然有效。

    还提到了一个事实,即还有其他包管理器可用于交付内容。

    在我看来,新世界的答案是创建一个包含 utility.js 的节点模块,然后让 npm 将其交付给您的项目。

    可能的解决方法:

    我查看了 .targets 以复制文件并使其正常工作,但它确实在每个构建上运行 - 这对您来说可能是也可能不是问题。我不能用它做我想做的事。

    在 [PackageId].targets 中:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <!-- Either do this for all scripts in the Scripts/js folder -->
        <Target Name="CopyScriptsToProject" BeforeTargets="Build">
            <Message Text="Copying scripts to project" />
            <ItemGroup>
                <SourceScripts Include="$(MSBuildThisFileDirectory)..\..\content\Scripts\js\**\*.*"/>
            </ItemGroup>
            <Copy SourceFiles="@(SourceScripts)" DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\wwwroot\js\%(RecursiveDir)%(Filename)%(Extension)')" Condition="!Exists('$(MSBuildProjectDirectory)\wwwroot\js\%(RecursiveDir)%(Filename)%(Extension)')" />
        </Target>
        <!-- Or do this for the individual script -->
        <Target Name="CopyUtilityScriptToProject" BeforeTargets="Build">
            <Copy SourceFiles="$(MSBuildThisFileDirectory)..\..\content\Scripts\js\Utility.js" DestinationFiles="$(MSBuildProjectDirectory)\wwwroot\js\Utility.js" Condition="!Exists('$(MSBuildProjectDirectory)\wwwroot\js\Utility.js')" />
        </Target>
    </Project>
    <!-- Note: condition can be removed from either if you want it to overwrite each build -->
    

    在 .csproj 文件中(将 [PackageId] 替换为您的包的名称):

    <Project Sdk="Microsoft.NET.Sdk">
        ... any Globals for source control stuff ...
        <PropertyGroup>
            <TargetFramework>netcoreapp2.0</TargetFramework>
            <Version>7.0.0</Version>
            <PackageId>[PackageId]</PackageId>
        </PropertyGroup>
        ... any PackageReference stuff ...
        <ItemGroup Label="Packaging">
            <Content Include="build\netcoreapp2.0\[PackageId].targets" PackagePath="build\netcoreapp2.0\[PackageId].targets" />
                <!-- Either -->
                <Content Include="Scripts\js\**\*.*" PackagePath="content\Scripts\js;contentFiles\Scripts\js" />
                <!-- or -->
                <Content Include="Scripts\js\Utility.js" PackagePath="content\Scripts\js;contentFiles\Scripts\js" />
            </ItemGroup>
    </Project> 
    

    似乎存在一个错误,即当 &lt;PackageId&gt;[PackageId]&lt;/PackageId&gt; 未在 .csproj 中明确设置时,构建目标不起作用。虽然这很可能是我的开发环境的一个问题。

    【讨论】:

    • 我会将您的可能解决方法的副本带到这里,尽管在 GitHub 上不太可能,但随着时间的推移它可能会变成一个坏链接。一旦你这样做(并且我测试它确实有效),我会接受你的作为接受的答案
    • 我已按照建议在此处添加了解决方法。希望您能在解决方法上取得一些成功。我想我要走 npm 路线了。
    • NuGet 团队的帮助下进行了测试:github.com/NuGet/Home/issues/6743 我们终于让它工作了,但是您的解决方案走在了正确的轨道上。如果有人感兴趣,您可以在此处找到工作解决方案的副本:github.com/NuGet/Home/issues/6743
    • 这在 .net 5 中有效吗?我试图复制你的例子,但它不适合我。
    【解决方案2】:

    显然您需要路径中的any\any (learn more) 以及包含&lt;PackageCopyToOutput&gt;true&lt;/PackageCopyToOutput&gt;,如下所示:

    <ItemGroup>
      <Content Include="Scripts\js\Utility.js">
        <Pack>true</Pack>
    
        <PackagePath>contentFiles\any\any\wwwroot\js\;content\any\any\wwwroot\js\</PackagePath>
    
        <PackageCopyToOutput>true</PackageCopyToOutput>
      </Content>
    </ItemGroup>
    

    在将.js 文件包含在包中之前,您还需要预编译您的TypeScript

    但是,这仍然没有在那里创建文件,只是对它的一些奇怪的引用。

    最后,我们得到了一个 .targets 文件,你可以在这里找到一个工作 repo:https://github.com/NuGet/Home/issues/6743

    【讨论】:

      【解决方案3】:

      Serj Sagan's answer 让我走上了正轨,但是将内容文件部署到bin 目录是不够的(正如他所指出的)。我可以通过更改使用项目的 .csproj 文件中的包引用选项来部署要部署的文件,如下所示:

      <PackageReference Include="MyNuGetPackage" Version="0.0.0.1">
        <IncludeAssets>all</IncludeAssets>
        <PrivateAssets>analyzers;build</PrivateAssets>
      </PackageReference>
      

      PrivateAssets 的默认值似乎是 contentfiles;analyzers;build (documentation),这不是我们在这种情况下想要的。

      【讨论】:

        【解决方案4】:

        来自@PurplePiranha 的简化代码和解释

        TL;DR

        Github 上的基本 .NET6 简化示例代码

        分步指南

        1. 文件选择

        首先我们需要选择所有需要进入 nuget 包的文件。 将此添加到 .csproj:

        <Project Sdk="Microsoft.NET.Sdk">
          ...
          <ItemGroup Label="Packaging">
            <Content Include="<Your directory path>\<your file(s)>" />
          </ItemGroup>
        

        允许多行内容。

        1. 写一个目标

        制作一个目标文件,将构建之前(或之后)的文件复制到 bin 目录:

        此文件的位置和名称很重要: \build\.targets

        现在,通过在 .csproj 中添加内容行来确保它会被执行:

        <Project Sdk="Microsoft.NET.Sdk">
          ...
          <ItemGroup Label="Packaging">
            <Content Include="build\<LibraryPackageName>.targets" PackagePath="build\<LibraryPackageName>.targets" />
        
            <Content Include="filesToAdd\*.txt">
              <Pack>true</Pack>
            </Content>
          </ItemGroup>
        

        例如:来自github中的代码:

        <Project Sdk="Microsoft.NET.Sdk">
          ...
          <ItemGroup Label="Packaging">
            <Content Include="build\PackageToGenerateFile.targets" PackagePath="build\PackageToGenerateFile.targets" />
        
            <Content Include="filesToAdd/*.txt">
              <Pack>true</Pack>
            </Content>
          </ItemGroup>
        

        注意:通过将文件复制到 bin 目录,文件不是版本控制的一部分,但你的包是!

        1. 构建和打包

        在 Visual Studio 中,右键单击包名称并选择“Pack”。 应该在库的 bin 目录中创建一个新的 nuget 包。

        1. 使用 nuget 包

        现在在您的目标包中安装 nuget 包。

        请注意,文件位于解决方案资源管理器中,但不在磁盘上的目录中。它们有一个快捷符号。

        1. 构建目标包

        检查 bin 目录。 文件应复制到目标中提到的位置。

        【讨论】:

          猜你喜欢
          • 2023-03-05
          • 1970-01-01
          • 2019-01-28
          • 1970-01-01
          • 1970-01-01
          • 2017-11-01
          • 2020-05-02
          • 2012-10-27
          • 1970-01-01
          相关资源
          最近更新 更多