的MSBuild:部署未包含在项目文件(MSBuild: Deploying files that

2019-08-01 09:35发布

我有minifies并连接使用JavaScript节点的文件的web项目预建事件。 这将创建一个称为是脚本文件夹的副本除了文件是精缩脚本文件夹BuiltScripts文件夹。 当我做了部署我要发布,包括在其中的BuiltScripts文件夹中的脚本文件夹。 要做到这一点我已经添加了BuiltScripts文件夹到项目中。 这是不是一个理想的解决方案:

  1. 我必须有BuiltScripts文件夹,以便建立签出在它的文件是只读的解决办法是源代码控制之下。 这种检查,因为我有这么多的文件签出时产生麻烦。
  2. 当我添加新的文件到项目中,我必须确保我记得它添加到BuiltScripts文件夹或文件的内置版本不会被部署。
  3. 作为BuiltScripts文件夹中的文件是只读的,那里还有我的构建将在构建服务器失败。
  4. 具有相同名称的文件的两个副本搜索文件和做基于文本的搜索时是一个问题。

我想有构建服务器构建和minifiy JavaScript文件的预编译的一步,但我不希望BuiltScripts文件夹添加到项目中。 然而,当构建服务器在最后打包项目,我希望它的BuiltScripts文件夹生成过程的输出复制。 我怎样才能做到这一点?

Answer 1:

除了使用项目属性(我认为这是你的意思)的预生成事件中,覆盖在的.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。” 我发现,清洁目标检查该项目组知道要删除的文件。

地方XML进入您的项目文件<Import>元素,你应该是好去。 无需检查的源代码控制,甚至你的构建服务器会很高兴。



Answer 2:

你不能使用生成后事件运行一个脚本,做你想要什么? 我用一到我的输出文件移动到完全无关的项目的位置。 无论是其简单的批处理的VBScript / JScript中,或PowerShell的你可以做你所需的内容。



Answer 3:

我也有类似的要求,但它仅涉及增加现有文件的部署包,而不是生成它们作为构建的一部分。 我发现在技术这个页面是有用的。



文章来源: MSBuild: Deploying files that are not included in the project