【问题标题】:msbuild task that works from publish profile to remove specific file从发布配置文件删除特定文件的 msbuild 任务
【发布时间】:2020-02-22 20:16:24
【问题描述】:

我的项目中有 3 个 json 文件。对于特定的发布配置文件,使用 FileSystem 发布,我试图找到一种方法让特定文件不发布到目标文件夹。这是一个 .net 核心控制台应用程序。

这是我的发布配置文件,但我试图限制发布的文件仍发布到目标文件夹。

<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <PublishProtocol>FileSystem</PublishProtocol>
    <Configuration>Debug</Configuration>
    <Platform>Any CPU</Platform>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <PublishDir>D:\projects\test_publish</PublishDir>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <SelfContained>false</SelfContained>
    <DeleteExistingFiles>false</DeleteExistingFiles>
    <ExcludeFilesFromDeployment>appsettings.Test.json</ExcludeFilesFromDeployment>
  </PropertyGroup>
</Project>

注意:项目文件包含这些文件,因此它们将出现在构建输出中。这可能会阻止 appsettings.Test.json 被删除,因此仍会被复制到发布目录?

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Update="appsettings.Local.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Update="appsettings.Test.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

【问题讨论】:

    标签: visual-studio msbuild


    【解决方案1】:

    这是我的发布配置文件,但我试图限制的文件 正在发布的仍然发布到目标文件夹。

    我在本地机器上测试它并重现相同的问题。我还发现,如果我像 asp.net 一样使用this element in web application,它总是可以工作的。所以我假设这个元素不支持发布 .net 核心控制台应用程序。

    该文件在您的项目中扮演什么角色?

    1.如果您的应用在build output directorypublish directory中不需要它,您可以将Copy to Output Directory设置为Do not copy

    然后清理您的发布文件夹并再次发布以检查是否有帮助。

    2.如果您有特定原因需要构建文件,但需要将其从发布文件夹中排除,请尝试将此脚本添加到您的 xx.csproj(Delete Task):

      <Target Name="CustomTarget" AfterTargets="_PublishNoBuildAlternative">
        <Delete Files="$(PublishDir)\appsettings.Test.json"/>
        <!--<Delete Files="$(PublishDir)\appsettings.xxx.json"/>-->
      </Target>
    

    您可以将MSbuild ConditionsCondition="$(Configuration)=='xxx'" 一样添加到目标中以使其更灵活。

    【讨论】:

    • 这就是问题所在,我在构建中确实需要它,以防我在本地运行并将我的环境设置为“测试”。但是,根据您的建议 #2,这似乎不起作用,因为 appsettings.Test.json 仍在发布目录中,是的,我确实清理了我的发布文件夹(实际上只是删除了 bin 和 obj 文件夹)并重新运行发布。
    • @bitshift 我的错...只需更新答案,_PublishNoBuildAlternative 目标应该是 .net 核心控制台而不是发布目标的工作目标。请通过在 VS IDE 中发布来测试它,如果您通过命令行运行它并且它在那里不起作用,请告诉我:)
    • 谢谢,但这也不起作用,是的,通过 VS 2019(社区版)发布。在办公室有 VS Pro,稍后会尝试。另请参阅上面的编辑。
    • 刚刚在 VS pro 中测试过,除了 VS 社区版之外,也不能在那里工作。因此,至少对于控制台应用程序来说,这是受支持的。也许我会把它作为一个问题发布在 .net core Github 上
    • 不确定这对您的项目不起作用,也许您可​​以将构建详细程度设置为详细以查看更多详细信息。无论如何,很高兴知道您找到了适用于您的机器的解决方法 :) 请考虑接受它作为自我回答,以便在 limit of two days 之后与其他人分享有用的信息 ...
    【解决方案2】:

    我想出的变通解决方案类似于我的另一个项目。它涉及到构建系统并在 csproj 文件中添加一些额外的位。

    所以 csproj 文件现在看起来像这样。它消除了你不需要的文件,你只需要添加一个相应的构建配置条目,这使用 VS 构建系统来确定这些 json 文件中的哪个得到输出。

      <ItemGroup>
        <None Update="appsettings.json">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </None>
        <None Update="appsettings.Local.json" Condition=" '$(Configuration)' == 'Debug' " >
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </None>
        <None Update="appsettings.Test.json" Condition=" '$(Configuration)' == 'Test' " >
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </None>
      </ItemGroup>
    

    【讨论】:

    • 您好,朋友,感谢您分享您的解决方法,请随时accept it as self-answer,这将有助于其他社区成员更轻松地搜索此有用信息!也许这个解决方法也适用于this issue?这只是一个提醒:)
    猜你喜欢
    • 1970-01-01
    • 2019-07-28
    • 2020-12-11
    • 1970-01-01
    • 2010-12-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    相关资源
    最近更新 更多