dotnet core nuget包复制时复制内容文件

时间:2018-03-22 09:32:43

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

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

我能够在我的nugetdotnet pack生成一个.csproj或更精确的parent nuget包,其中包含我在包中的内容文件项目:

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

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

问题在于,当我在'child'progect中使用此包时,Typescript永远不会被复制到child项目的任何文件夹中,尽管我可以看到它在{.nuget\packages\parent\...中提取1}}文件夹。

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

3 个答案:

答案 0 :(得分:3)

来自: 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来复制文件并使其工作,但它确实在每个构建上运行 - 这对您来说可能是也可能不是问题。我无法用它做我想做的事。

image

在[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> 

似乎有一个错误,当{。1}}没有在.csproj中明确设置时,构建目标不起作用。虽然这可能是我的开发环境的一个问题。

答案 1 :(得分:1)

显然,您需要路径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文件包含在包中之前,您还需要预编译 // Get source cell type and style CellType type_from = cell_from.getCellTypeEnum(); CellStyle style_from = cell_from.getCellStyle(); // Get source cell data format short df = style_from.getDataFormat(); // Change dest cell cell type, set format on it cell_to.setCellType(type_from); CellStyle style_to = cell_to.getCellStyle(); style_to.setDataFormat(df); cell_to.setCellStyle(style_to);

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

最后,我们使用Vue.component('cropper-admin', require('./js/component.vue')); 文件,你可以在这里找到一个工作回购:learn more

答案 2 :(得分:1)

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),在这种情况下,这不是我们想要的。