web-dev-qa-db-ja.com

Visual Studio 2017でNugetパッケージにファイルを追加するにはどうすればよいですか

最近、Visual Studio 2017 Community Editionに移動しました。 2つの素晴らしい新機能があります

  1. ソースファイルを明示的にcsprojに含める必要はありません。これは自動的に行われますが、
  2. nugetパッケージを直接ビルドできます。

オープンソースCodeFirstWebFramework DLLをNugetパッケージとしてパッケージ化します。DLLを含めるだけでなく、パッケージにはディレクトリツリー全体を含める必要があります。他のファイル(.js、.tmpl、.css、および.mdファイルを含む)。

このディレクトリツリーをパッケージに含めることをVisual Studioに伝えるにはどうすればよいですか?

広範囲な検索で見つけた情報から、csprojにファイルを追加することに関するすべての古い情報を無視して、見つけることができるのはcontentFilesフォルダーに置くことだけでしたが、これはそうではないようです作業。

私のプロジェクトファイルは次のようになります。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net45</TargetFramework>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    <Authors>Nikki Locke</Authors>
    <Company>Trumphurst Ltd</Company>
    <Description>Easy to use web server for building web apps that use sql databases generated from c# classes</Description>
    <Copyright>2017 Trumphurst Ltd.</Copyright>
    <PackageProjectUrl>https://github.com/nikkilocke/CodeFirstWebFramework</PackageProjectUrl>
    <RepositoryUrl>https://github.com/nikkilocke/CodeFirstWebFramework</RepositoryUrl>
    <RepositoryType>Github</RepositoryType>
    <PackageTags>C# SQL Code First Web Server</PackageTags>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Markdig" Version="0.12.1" />
    <PackageReference Include="Mono.Data.Sqlite.Portable" Version="1.0.3.5" />
    <PackageReference Include="mustache-sharp" Version="0.2.10" />
    <PackageReference Include="MySql.Data" Version="6.9.9" />
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="System.Net" />
    <Reference Include="System.Web" />
  </ItemGroup>

</Project>

Web上の競合する情報や古い情報から何をする必要があるかを大まかに推測して、以下を追加しました。

  <ItemGroup>
    <Content Include="contentFiles/**/*.*" copyToOutput="true">
      <IncludeInPackage>true</IncludeInPackage>
    </Content>
  </ItemGroup>

これで、.nupkgファイルにはcontentFilesフォルダーの内容が含まれています(2つの場所、contentフォルダーとcontentFilesフォルダー)。

ただし、パッケージを別のプロジェクトにインストールすると、コンテンツファイルは表示されませんが、objフォルダーのproject.assets.jsonファイルにリストされます。

21
Nikki Locke

プロジェクトファイルを再度変更したため、次のようになりました。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net45</TargetFramework>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    <Authors>Nikki Locke</Authors>
    <Company>Trumphurst Ltd</Company>
    <Description>Easy to use web server for building web apps that use sql databases generated from c# classes</Description>
    <Copyright>2017 Trumphurst Ltd.</Copyright>
    <PackageProjectUrl>https://github.com/nikkilocke/CodeFirstWebFramework</PackageProjectUrl>
    <RepositoryUrl>https://github.com/nikkilocke/CodeFirstWebFramework</RepositoryUrl>
    <RepositoryType>Github</RepositoryType>
    <PackageTags>C# SQL Code First Web Server</PackageTags>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Markdig" Version="0.12.1" />
    <PackageReference Include="Mono.Data.Sqlite.Portable" Version="1.0.3.5" />
    <PackageReference Include="mustache-sharp" Version="0.2.10" />
    <PackageReference Include="MySql.Data" Version="6.9.9" />
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="System.Net" />
    <Reference Include="System.Web" />
  </ItemGroup>

  <ItemGroup>
    <Content Include="contentFiles/**/*.*" copyToOutput="true">
      <IncludeInPackage>true</IncludeInPackage>
      <CopyToOutput>true</CopyToOutput>
      <BuildAction>Content</BuildAction>
      <copyToOutput>true</copyToOutput>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <Compile Remove="Phone\**" />
    <EmbeddedResource Remove="Phone\**" />
    <None Remove="Phone\**" />
  </ItemGroup>

</Project>

ContentFilesは、NuGetパッケージをダウンロードするプロジェクトの同じ名前のフォルダー(つまり、contentFiles)に正常にコピーされました-どのディレクティブが機能したかはわかりませんが、そのうちの1つはしました。

残念ながら、コンテンツはコンパイル時にプロジェクトの出力フォルダーに自動的にコピーされません-提案を歓迎します。

5
Nikki Locke

最初に、nugetパッケージの参照方法に応じて、ファイルをcontentフォルダーまたはcontentFilesフォルダーに配置する必要があることに注意してください。この最後を参照してください セクション

基本的に、nugetプロジェクトがpackage.configファイルによって参照される場合、nugetパッケージのコンテンツフォルダーからのファイルは、参照元プロジェクトにコピーされます。 nugetパッケージがプロジェクトファイルのPackageReferenceによって参照されている場合、パッケージ内のcontentFilesフォルダーのファイルが使用されます。両方を含めることをお勧めします。

ContentFilesフォルダーの構造は here にあります。コピーするファイルの言語とフレームワークを指定することができます。

あなたの場合:

<ItemGroup>
    <Content Include="contentFiles/**/*.*">
        <Pack>true</Pack>
        <PackagePath>contentFiles\any\any;content</PackagePath>
    </Content>
</ItemGroup>
1
Fabian

「Content」と「IncludeInPackage」でラップするだけで、ファイルをパッケージにコピーできます。

1
user3724031