【问题标题】:MsBuild Target doesn't workMsBuild 目标不起作用
【发布时间】:2018-05-31 13:28:35
【问题描述】:

从 Visual Studio 2017 发布到服务器后,我想更改 .csproj 文件以执行我的目标。

<PropertyGroup>
    <PostBuildEvent>copy $(ProjectDir)\lib\Oracle.ManagedDataAccess.dll $(ProjectDir)\bin</PostBuildEvent>
  </PropertyGroup>
  <PropertyGroup>
    <PreBuildEvent>copy $(ProjectDir)\lib\Oracle.ManagedDataAccess.dll $(ProjectDir)\bin</PreBuildEvent>
  </PropertyGroup>  

  <ItemGroup>
    <OracleSourceFile Include="$(ProjectDir)\lib\Oracle.ManagedDataAccess.dll"/>
    <OracleDestinationFolder Include="$(ProjectDir)\bin"/>
  </ItemGroup>

  <Target Name="OracleTarget" AfterTargets="MSDeployPublish" >        
   <Copy
        SourceFiles="@(OracleSourceFile)"
        DestinationFolder="@(OracleDestinationFolder)">        
    </Copy>
  </Target>

但这不起作用。我在发布输出中没有看到我的目标已执行。我做错了什么?

【问题讨论】:

  • 你在 Visual Studio 中使用发布配置文件吗?
  • @CodeNotFound 是的,我愿意
  • 所以我推荐你阅读this article
  • @CodeNotFound 谢谢你的想法。它有效。

标签: .net msbuild visual-studio-2017


【解决方案1】:

在阅读了Microsoft best practices about deploying web application,特别是this page(讨论了部署额外文件)之后,我终于修改了我的.pubxml,如下所示:

<Target Name="OracleCollectFiles">
    <ItemGroup>
      <OracleSourceFile Include="lib\**\*" />     
      <FilesForPackagingFromProject Include="%(OracleSourceFile.Identity)">
        <DestinationRelativePath>bin\%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
  </Target>

<PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
      OracleCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>

    <CopyAllFilesToSingleFolderForMsdeployDependsOn>
      OracleCollectFiles;
      $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
    </CopyAllFilesToSingleFolderForMsdeployDependsOn>
  </PropertyGroup>

</Project>

【讨论】:

    【解决方案2】:

    MsBuild 目标不起作用

    您可以从File System 发布您的项目。 File System 不支持目标“MSDeployPublish”。

    "我们目前不支持在发布后执行自定义目标 来自 VS 的文件系统协议。如果您从命令发布 然而,目标将被执行的行。”

    因此,我们可以使用 MSBuild 命令行通过指定目标 /t:OracleTarget 来执行此自定义目标:

    msbuild "YourSolutionFile" /t:Build,OracleTarget /p:DeployOnBuild=true /p:PublishProfile=YourPublishFile.pubxml
    

    除此之外,针对此问题的另一个解决方案,您可以使用目标CopyAllFilesToSingleFolderForPackage 而不是MSDeployPublish

      <Target Name="OracleTarget" AfterTargets="CopyAllFilesToSingleFolderForPackage" >        
       <Copy
            SourceFiles="@(OracleSourceFile)"
            DestinationFolder="@(OracleDestinationFolder)">        
        </Copy>
      </Target>
    

    希望这会有所帮助。

    【讨论】:

    • 不幸的是,AfterTargets="CopyAllFilesToSingleFolderForPackage" 对我不起作用。 MSBuild 命令行不是很舒服。所以我使用 .pubxml 作为@CodeNotFound 推荐。
    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多