dotnet core nuget 包在还原时复制内容文件

Ser*_*gan 7 nuget .net-core dotnet-core-pack

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

通过在我的项目中使用它,我能够生成一个nuget或更准确的dotnet packnuget 包,其中包含我的内容文件:.csprojparent

<ItemGroup>
  <Content Include="Scripts\Utility.ts">
    <Pack>true</Pack>
    <PackagePath>contentFiles\Scripts\;content\Scripts</PackagePath>
  </Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ser*_*gan 6

显然你需要any\any在路径中(了解更多)以及包含<PackageCopyToOutput>true</PackageCopyToOutput>,如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

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

然而,这仍然不会在那里创建文件,只是对它的一些奇怪的引用。

最后,我们让它使用一个.targets文件,您可以在这里找到一个工作存储库: https: //github.com/NuGet/Home/issues/6743


Pur*_*nha 6

来自: 宣布支持通用 Windows 平台的 NuGet 3.1

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

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

在我看来,新世界的答案是创建一个包含实用程序.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 -->
Run Code Online (Sandbox Code Playgroud)

并在 .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> 
Run Code Online (Sandbox Code Playgroud)

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