【问题标题】:MSBUILD Unable to force PackageLocation for Package targetMSBUILD 无法强制包目标的 PackageLocation
【发布时间】:2011-08-05 17:51:14
【问题描述】:

我正在尝试从 msbuild 为我的 Web 服务构建部署包,就像在 Visual Studio 中通过右键单击项目文件所做的那样。

包创建良好,并放在项目文件的源目录下的 /obj/Release/Packages 文件夹中。

您应该能够通过在项目文件内的 PropertyGroup 中设置 PackageLocation 属性来指定该包的创建位置。但是,这对我不起作用。它仍然将包放在源目录下的 /obj/Release/Packages 中。

这是我的项目文件中的 sn-p:

  <Import Project="$(SrcTreeRoot)\Build\TaskInit.Tasks" />
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
  <Import Project="$(SrcTreeRoot)\Build\TaskOverrides.Tasks" />
  <PropertyGroup>
    <Platform>Any Cpu</Platform>
    <Configuration>Dev</Configuration>
    <PackageLocation>$(PackageOutputDir)\MatrixOnCdsService\MatrixOnCdsService.zip</PackageLocation>
    <PackageAsSingleFile>True</PackageAsSingleFile>
    <EnablePackageProcessLoggingAndAssert>True</EnablePackageProcessLoggingAndAssert>
    <!--OutDir>$(PackageOutputDir)\MatrixOnCdsService\</OutDir-->
  </PropertyGroup>

我们还使用了包含以下部分的 MasterBuild.proj:

    <PackageProject Include="..\Source\AnalysisSuite\MatrixOnCdsService\MatrixOnCdsService.csproj"/>

...

<Target Name="Package">
    <MSBuild Projects="@(PackageProject)" Targets="Package" Properties="Platform=$(Platform);
                                                                       Configuration=$(Configuration);
                                                                       DeployOnBuild=true;
                                                                       DeployTarget=Package;
                                                                       PackageLocation=$(PackageLocation);"/>
</Target>

TaskInit.tasks 是我们自己的自定义导入文件,其中包含 PackageOutputDir 属性,我们使用它来告诉项目将包放在哪里。

我的问题是为什么即使在指定 PackageLocation 之后,包仍被放置在 /obj/Release/Packages 文件夹中?

【问题讨论】:

  • 你确定属性,特别是 PackageLocation 是实际传递给目标包的吗?在 msbuild 语句之前输入一条消息,看看是否不是空字符串。
  • 我通过调试运行构建并在目标中设置断点。你是正确的 PackageLocation 是空的。我只是不明白为什么它是空的。

标签: msbuild msdeploy webdeploy


【解决方案1】:

将您拥有的属性组粘贴到目标中:

<Target Name="SetValues">
  <PropertyGroup>
    <Platform>Any Cpu</Platform>
    <Configuration>Dev</Configuration>
    <PackageLocation>$(PackageOutputDir)\MatrixOnCdsService\MatrixOnCdsService.zip</PackageLocation>
    <PackageAsSingleFile>True</PackageAsSingleFile>
    <EnablePackageProcessLoggingAndAssert>True</EnablePackageProcessLoggingAndAssert>
    <!--OutDir>$(PackageOutputDir)\MatrixOnCdsService\</OutDir-->
  </PropertyGroup>
</Target>

然后将其添加为您的包目标的 DependsOnTarget,我认为您将传递您的值。

例如&lt;Target Name="Package" DependsOnTargets="SetValues"&gt;

【讨论】:

  • 感谢您的回复。为什么这些属性必须在目标中,而项目文件中的其他属性却没有?
【解决方案2】:

您可以在 MasterBuild.proj 中执行以下操作。

  <Target Name="Package">
    <ConvertToAbsolutePath Paths="$(PackageOutputDir)">
      <Output TaskParameter="AbsolutePaths" PropertyName="Source_Dir_Abs"/>
    </ConvertToAbsolutePath>
   <MSBuild Projects="@(PackageProject)" Targets="Package"
      properties="Platform=$(Platform);
      Configuration=$(Configuration);
      DeployOnBuild=false;
      DeployTarget=Package;
      PackageLocation=$(Source_Dir_Abs)\$(PackageProjectName).zip;
      PackageAsSingleFile=true;
      ExcludeFilesFromDeployment=Web.config;
      _PackageTempDir=$(PackageOutputDir)\temp;">
  </MSBuild>
  </Target>

在调用 msbuild 时,您需要通过执行以下操作添加将在 $(PackageProjectName) 中使用的属性:

msbuild.exe /property:PackageProjectName=$project

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 2013-04-02
    • 2011-02-06
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多