8

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

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

<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项目中。Init.ps1然后我尝试在我的包的文件夹中尝试使用的黑暗路径tools,虽然无法调试,但它似乎也偶尔运行(我完全卸载并重新安装了包,它仍然无法运行大部分时间.) 这可能是这样,但我不知道为什么我不能让它输出到Package Manager Console......也许还有希望,Init.ps1但我似乎无法弄清楚。最后,我看到了nuget.targets文件的一些潜力但我似乎也掌握了如何将它用于我的目的!我希望得到一些关于如何完成这项工作的反馈。

4

4 回答 4

6

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

对于在 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> 

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

于 2018-03-30T13:18:34.047 回答
4

显然,您需要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>

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

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

最后,我们让它与一个.targets文件一起工作,你可以在这里找到一个工作仓库:https ://github.com/NuGet/Home/issues/6743

于 2018-03-22T21:14:07.197 回答
1

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

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

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

于 2019-09-17T23:30:38.543 回答
0

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

TL;博士

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

分步指南

解决方案浏览器

  1. 文件的选择

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

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

允许多个内容行。

  1. 写一个目标

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

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

现在,通过在 <LibraryPackageName>.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 目录。文件应复制到目标中提到的位置。

于 2022-01-14T16:39:54.897 回答