.csprojのMsBuildとdotnetpackコマンドを使用して、Nugetパッケージから出力ディレクトリにファイルをコピーします

JérômeMEVEL

前回、Nugetパッケージからいくつかのファイルを抽出する方法を見つける必要があったので、少なくとも6か月かかりましたが、ようやく解決策を見つけることができました

重要なのは、このソリューションは、.nupkgファイルがあることを前提としており.targets、抽出プロセスを実行するためにファイルを手動で追加することです。

今、物事は異なります:

  1. .nupgkファイルがありませんdotnet pack。コマンドを使用して、VSTSサーバー上でファイルを自動的に生成します次に、Nugetサーバーからパッケージを使用します
  2. 解決策を見つけるのにさらに6か月かかる余裕はありません

これが私の ProjectName.csproj

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
        <Authors>Jérôme MEVEL</Authors>
        <Version>1.0.3</Version>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

        <!-- This answer got many votes on a Github thread so I tried just in case -->
        <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

        <!-- Just trying that too-->
        <IncludeBuildOutput>true</IncludeBuildOutput>
        <IncludeContentInPack>true</IncludeContentInPack>

        <!-- I wanted to see the full generated Nuget package -->
        <IncludeSource>true</IncludeSource>

        <!-- desperate attempt -->     
        <TargetsForTfmSpecificBuildOutput>GetMyPackageFiles</TargetsForTfmSpecificBuildOutput>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Dapper" Version="1.50.5" />
        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
        <PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.1" />
        <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.1.1" />
        <PackageReference Include="NLog" Version="4.5.8">

            <!-- Let's try this too just in case-->
            <IncludeAssets>all</IncludeAssets>
        </PackageReference>
        <PackageReference Include="NLog.Extensions.Logging" Version="1.2.1">
            <IncludeAssets>all</IncludeAssets>
        </PackageReference>
        <PackageReference Include="NLog.Web.AspNetCore" Version="4.6.0">
            <IncludeAssets>all</IncludeAssets>
        </PackageReference>
        <PackageReference Include="System.Data.Common" Version="4.3.0" />
        <PackageReference Include="System.Data.SqlClient" Version="4.5.1" />
    </ItemGroup>
    <ItemGroup>

        <!-- Added the file to the root folder in case <IncludeAssets>all</IncludeAssets> is looking there -->
        <Content Include="NLog.config">
            <Pack>true</Pack>
            <PackagePath>NLog;;</PackagePath>
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>

        <!-- My desired path to look for the file -->
        <Content Include="NLog\NLog.config">
          <Pack>true</Pack>
          <PackagePath>NLog;;</PackagePath>
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
    </ItemGroup>

    <!-- This is the default setting, perfectly working when I reference the project instead of installing the Nuget package -->
    <ItemGroup>
        <None Update="NLog\NLog.config">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </None>
    </ItemGroup>

    <!-- desperate attempt -->
    <Target Name="GetMyPackageFiles">
        <ItemGroup>
            <BuildOutputInPackage Include="NLog/Nlog.config">
                <TargetPath>NLog</TargetPath>
            </BuildOutputInPackage>
        </ItemGroup>
    </Target>
</Project>

ご覧のとおり、私はいくつかの異なる設定を試しました。このMsBuildにより、NugetパッケージファイルのルートNLog.configにあるNLogフォルダーにファイルが含まれるようになります。

ここに画像の説明を入力してください

さまざまな試行中に、設定した構成に応じて、で、またはでさえNLog.configファイルを作成することができsrc/ProjectName.Logging/NLog/NLog.configましたlib/netstandard2.0/Nlog.config

したがって、私のファイルは間違いなくNugetパッケージファイルに含まれていますが、パッケージを使用するプロジェクトの出力ディレクトリにはコピーされません。

ここで説明.nuspecするdotnet packようにパッケージを生成するときにファイルを指定しようとしましたが、目的の結果を得ることができませんでした(自分だけがNugetパッケージに含まれているか、すべてのソースファイルに含まれていました)。さらに、これには、ファイル内の構成をオーバーライドしたり、無駄な複雑さを追加したりするなど、いくつかの欠点があります私が達成したいことは、ファイルを使用せずに実行できると思います(おそらく私は間違っています)。NLog.config.csproj.nuspec

build/ProjectName.targetsパッケージにファイルがないことに気づきました。これはおそらく不足している部分です。では.targets、パッケージを手動で変更せずにこのファイルを追加するにはどうすればよいですか?

設定ファイルをNugetパッケージから出力ディレクトリにコピーする別の方法はありますか?

誰かが私がこの問題を解決するのを手伝ってくれることを本当に望んでいます。同じ操作をしたいのは2回目ですが、少し違いがあり、また難しいです。

どうもありがとう

wmorian

ここで説明するようにファイル.nuspecからnugetを作成すると、ファイルなしでファイルをコピーすることができます.csproj

また、ファイルをnugetから出力ディレクトリにコピーするにはProjectName.targets、次の内容のファイルを作成します。

<ItemGroup>
    <LogFiles Include="$(MSBuildThisFileDirectory)\..\contentFiles\LogFiles\*.config" />
</ItemGroup>
<Target Name="CopyLogFiles" BeforeTargets="Build">
    <Copy SourceFiles="@(LogFiles)" DestinationFolder="$(TargetDir)CopiedLogFiles\" />
</Target>

あなたの中.csprojのファイルの追加:

<ItemGroup Label="FilesToCopy">
   <Content Include="ProjectName.targets" PackagePath="build/ProjectName.targets" />
   <Content Include="LogFiles\*.config" Pack="true" PackagePath="contentFiles\LogFiles">
     <PackageCopyToOutput>true</PackageCopyToOutput>
   </Content>
</ItemGroup>

もちろん、パスと名前は自由に選択できます。

これ.configにより、すべてのファイルCopiedLogFilesが出力ディレクトリで呼び出されるフォルダにコピーされます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ