Deployment MSBuild:部署项目中未包含的文件

Deployment MSBuild:部署项目中未包含的文件,deployment,msbuild,pre-build-event,Deployment,Msbuild,Pre Build Event,我在一个web项目上有一个预构建事件,它使用node缩小并连接javascript文件。这将在“脚本”文件夹中创建一个名为BuiltScripts的文件夹,该文件夹与“脚本”文件夹重复,但文件已缩小。在执行部署时,我希望发布脚本文件夹,包括其中的BuiltScripts文件夹。为了实现这一点,我将BuiltScripts文件夹添加到项目中。这不是理想的解决方案,因为: 我必须签出BuiltScripts文件夹才能进行构建,因为其中的文件是只读的,因为解决方案受源代码管理。这会在签入时造成麻烦,因

我在一个web项目上有一个预构建事件,它使用node缩小并连接javascript文件。这将在“脚本”文件夹中创建一个名为BuiltScripts的文件夹,该文件夹与“脚本”文件夹重复,但文件已缩小。在执行部署时,我希望发布脚本文件夹,包括其中的BuiltScripts文件夹。为了实现这一点,我将BuiltScripts文件夹添加到项目中。这不是理想的解决方案,因为:

  • 我必须签出BuiltScripts文件夹才能进行构建,因为其中的文件是只读的,因为解决方案受源代码管理。这会在签入时造成麻烦,因为我签出了太多文件
  • 当我向项目中添加新文件时,我必须确保我记得将其添加到BuiltScripts文件夹中,否则将不会部署该文件的构建版本
  • 我的构建将在构建服务器上失败,因为BuiltScripts文件夹中的文件也是只读的
  • 在搜索文件和执行基于文本的搜索时,具有同名文件的两个副本是一个问题

  • 我希望将构建服务器构建和最小化javascript文件作为预构建步骤,但我不希望将BuiltScripts文件夹添加到项目中。但是,当构建服务器在最后打包项目时,我希望它将构建过程的输出复制到BuiltScripts文件夹。如何实现这一点?

    您不能使用生成后事件来运行脚本以执行所需操作吗?我使用它将输出文件移动到与项目完全无关的位置。无论是普通批处理、VBScript/JScript还是PowerShell,您几乎可以做任何您想做的事情

    在.csproj/.vbproj文件中重写BeforeBuild目标,而不是使用项目属性的预构建事件(我想这就是您的意思)

    <Project ...>
      ...
      <Target Name="BeforeBuild">
        <!-- Create the 'BuildScripts' directory. -->
        <!-- The $(IntermediateOutputPath) reference the 'obj' folder, which I like to -->
        <!-- use for these kinds of things. -->
        <MakeDir Directories="$(IntermediateOutputPath)BuiltScripts">
          <Output PropertyName="BuildScriptsPath" TaskParameter="DirectoriesCreated" />
        </MakeDir>
        <!-- Execute the javascript minifier. -->
        <Exec Command="..." />
        <!-- Create an item group for the minified scripts so we manipulate the target path. -->
        <CreateItem Include="$(BuildScriptsPath)\*.js">
          <Output ItemName="BuiltScripts" TaskParameter="Include" />
          <Output ItemName="FileWrites" TaskParameter="Include" />
        </CreateItem>
        <!-- Add the minified scripts to the Content item group, -->
        <!-- which the deployment MSBuild inspects for files to deploy. -->
        <CreateItem Include="@(BuiltScripts)"
          AdditionalMetadata="TargetPath=scripts\%(Filename)%(Extension)">
          <Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
        </CreateItem>
      </Target>
      ...
    </Project>
    
    
    ...
    ...
    
    如果没有将文件部署到正确的目录中,您可能必须处理CreateItem任务输出的内容项组的形状。请注意,我使用了项转换来生成目标路径
    scripts\YourScript.js

    还要注意,第一个CreateItem任务将输出填充到一个名为“FileWrites”的项目组中。我发现Clean目标会检查该项目组以了解要删除的文件


    将XML放入项目文件
    元素之后,就可以开始了。不需要检查源代码管理,甚至您的构建服务器也会很满意。

    我有一个类似的要求,尽管它只涉及将现有文件添加到部署包中,而不是作为构建的一部分生成它们。我发现这项技术非常有用。

    部署\发布时使用的是什么-这是标准的msbuild目标还是您定制了一些东西?@AlexeyShcherbak msbuild,TFS,nothing custom我怀疑Sayed Ibrahim Hashimi在您的问题之后写了这篇文章并给出了答案:)。=)好吧,这可能完全是巧合。不管怎样,看起来他的答案最适合你的问题。对于这个问题,我做了一些与Sayed相同方向的msbuild挖掘。总体回答必须和他的非常相似。现在有点过时了;)@AlexeyShcherbak你为什么说它过时了?你能添加一个步骤来删除以前的BuiltScripts文件夹内容吗?我运行了我的示例代码,看起来IncrementalClean目标会自动删除这些文件,因为它们包含在FileWrites项目组中,当您删除一个.js文件并且不想再部署它时,这非常有用。