问题:
如果您将生成的 *.js 文件添加到 TFS,则 TFS 会写保护它们,如果您签入或不签出它们。因此,如果您更改 *.ts 文件,它无法生成 *.js 文件,因为该文件是写保护的。
==> 错误
但是如果你不签入,如果你运行部署,*.js 文件将会丢失。
==> 编译,但运行时错误
另外,如果您需要它作为嵌入式资源,则不能排除该文件...
附加问题1:
如果您运行“重建解决方案”,Visual Studio 想要在执行构建之前删除 TypeScript 生成的 *.js 文件。
但是无法删除,因为 *.js 文件是写保护的...
==> 错误
附加问题2:
由于清理不是“构建”,因此预构建事件不会在清理时执行......
因此,如果您在预构建中删除写保护,如果您执行“构建”,它将起作用,但它如果您选择“重建”,无论您是在解决方案中还是在项目中进行,都会失败。
附加问题 3:
您无法在项目设置编辑器中定义预清理事件命令。
因此,您可以执行以下操作:在您的 typescripted *.js 文件上
运行attrib -r /s
(删除写保护)作为预构建操作。
例如
attrib -r /s "$(ProjectDir)Resources/Scripts/0/*.js"
这是有效的,因为 * 被扩展了:
- 如果文件不存在,则没有错误,因为没有执行任何命令。
- 如果文件确实存在,则没有错误,则执行命令。
如果您在文件名上运行它,如果该文件不存在,它将失败。
现在,您需要手动编辑项目文件 (*.csproj),以添加预清理操作。
pre-clean 操作与 pre-build 操作相同。
<Target Name="BeforeClean">
<!-- DO YOUR STUFF HERE -->
<Exec Command="attrib -r /s "$(ProjectDir)Resources/Scripts/0/*.js"" />
</Target>
你去吧。现在您可以检查 *.js 文件,可以编辑 *.ts 文件(您需要取消保护 *.js 文件,或者之后运行构建)
如果要基于每个文件运行它,命令是:
if EXIST "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js" (
attrib -r "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
)
或以 XML 形式:
<Exec Command="if EXIST "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js" (
attrib -r "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
)" />
您还可以使用 TFS 命令行工具检查各个文件,而不是在预构建操作中删除只读属性批发:
"$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe" checkout /lock:none "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
顺便说一句,您可以在此处找到 VisualStudio/MsBuild 宏的列表:
https ://docs.microsoft.com/en-us/cpp/ide/common-macros-for-build-commands-and-properties?view= VS-2017
并找出宏的实际值:
- 在解决方案资源管理器中右键单击您的项目,选择属性
- 选择构建事件选项卡
- 单击Edit pre-build或Edit post-build按钮,都可以
- 在弹出的窗口中,单击宏按钮
- 向下滚动列表直到找到
ProjectDir
,在下一个窗格中是它的实际值
此外,您可以将签出添加为 BeforeBuild-target 命令,而不是在项目中使用预构建事件。这样,如果他们将某些东西放入项目设置中的预构建中,任何人都不会意外删除它。
<Target Name="BeforeBuild">
<Exec Command=""$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe" checkout /lock:none "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"" />
</Target>