Deployment MSBuild:部署项目中未包含的文件
我在一个web项目上有一个预构建事件,它使用node缩小并连接javascript文件。这将在“脚本”文件夹中创建一个名为BuiltScripts的文件夹,该文件夹与“脚本”文件夹重复,但文件已缩小。在执行部署时,我希望发布脚本文件夹,包括其中的BuiltScripts文件夹。为了实现这一点,我将BuiltScripts文件夹添加到项目中。这不是理想的解决方案,因为:Deployment MSBuild:部署项目中未包含的文件,deployment,msbuild,pre-build-event,Deployment,Msbuild,Pre Build Event,我在一个web项目上有一个预构建事件,它使用node缩小并连接javascript文件。这将在“脚本”文件夹中创建一个名为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文件并且不想再部署它时,这非常有用。